我有一个data.table,我需要从不同的行位置开始提取相等长度的段.最简单的方法是什么?例如:
x <- data.table(a=sample(1:1000,100), b=sample(1:1000,100))
r <- c(1,2,10,20,44)
idx <- lapply(r, function(i) {j <-which(x$a == i); if (length(j)>0) {return(j)} })
y <- lapply(idx, function(i) {if (!is.null(i)) x[i:(i+5)]})
do.call(rbind, y)
a b
1: 44 63
2: 96 730
3: 901 617
4: 446 370
5: 195 341
6: 298 411
Run Code Online (Sandbox Code Playgroud)
这当然不是data.table做事的方式所以我希望有更好的方法吗?
编辑:根据下面的评论,我编辑它只是为了清楚,它们中的值a不一定是连续的,也不对应于行号.
虽然允许使用重复的行(和列)名称matrix,但不允许使用data.frame。尝试对rbind()具有共同行名的某些数据框突出显示此问题。考虑下面的两个数据帧:
foo = data.frame(a=1:3, b=5:7)
rownames(foo)=c("w","x","y")
bar = data.frame(a=c(2,4), b=c(6,8))
rownames(bar)=c("x","z")
# foo bar
# a b a b
# w 1 5 x 2 6
# x 2 6 y 4 8
# y 3 7
Run Code Online (Sandbox Code Playgroud)
现在尝试使用rbind()它们(请注意行名):
rbind(foo, bar)
# a b
# w 1 5
# x 2 6
# y 3 7
# x1 2 6
# z 4 8
Run Code Online (Sandbox Code Playgroud)
但是对于matrix:
rbind(as.matrix(foo), as.matrix(bar))
# a b
# …Run Code Online (Sandbox Code Playgroud) 说我有两个向量v1和v2和,我想打电话rbind(v1, v2).但是,假设length(v1)> length(v2).从文档中我已经读过,较短的向量将被回收.以下是此"回收"的示例:
> v1 <- c(1, 2, 3, 4, 8, 5, 3, 11)
> v2 <- c(9, 5, 2)
> rbind(v1, v2)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8]
v1 1 2 3 4 8 5 3 11
v2 9 5 2 9 5 2 9 5
Run Code Online (Sandbox Code Playgroud)
v2被回收,而是将其余的条目设为0?非常感谢所有帮助!
我想rbind在一个摘要中有几个矩阵.它们是不同功能的对象产品,并且在它们的名称中共享一个模式.
我想要做的是告诉R寻找具有该常见模式的所有对象然后再查找rbind它们.
假设存在这些矩阵:
commonname.N1<-matrix(nrow=2,ncol=3)
commonname.N2<-matrix(nrow=2,ncol=3)
commonname.M1<-matrix(nrow=2,ncol=3)
Run Code Online (Sandbox Code Playgroud)
我试过这样的东西来得到它们:
mats<-grep(x= ls(pos=1), pattern="commonname.", value=TRUE)
mats
[1] "commonname.N1" "commonname.N2" "commonname.M1"
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚的是如何判断rbind使用它作为参数.基本上我会提供与rbind(commonname.N1, commonname.N2, commonname.M1)本例中相同的矩阵.
我已经尝试过了
mats<-toString(mats)
rbind(mats2)
Run Code Online (Sandbox Code Playgroud)
但这只是创建一个矩阵,其中不同的对象作为名称.
mats<-as.list(mats)
do.call(what=rbind, args=as.list(mats))
Run Code Online (Sandbox Code Playgroud)
不做这个工作.
对不起,如果有什么基本的我在某处遗漏,但我无法弄明白,我对R来说比较新.
我有一个 3 维数组,并希望通过逐行堆叠一维(组合一维行)来折叠为二维数组。在我的代码中,我在每个索引处填充了一个二维数组的“工作表”(第 3 维),现在我想获取该 3 维数组并将这些工作表的行堆叠在一起。
这是一个示例数组,因此我可以解释我希望最终结果的样子:
x <- array(1:24, dim=c(2, 3, 4),
dimnames=list(letters[1:2], LETTERS[1:3], letters[23:26]))
dim(x)
Run Code Online (Sandbox Code Playgroud)
我希望w, x, y,z在一个二维数组中相互堆叠,该数组有 8 行和 3 列。这是一种麻烦的方法(并且在我的循环中不可能):
x1<-x[,,1]
x2<-x[,,2]
x3<-x[,,3]
x4<-x[,,4]
All<-rbind(x1,x2,x3,x4)
Run Code Online (Sandbox Code Playgroud)
我已经看过了abind,adrop但他们不太正确。
我也试过,aperm但我认为你不能用这个来减少尺寸,只是转置(?)
或者,我可以创建一个list(这将是理想的,实际上,因为数组可能具有不同的行号)。在这种情况下,我将如何以相同的方式组合列表中多个元素的行?
谢谢!
我有一个这样的数据框(4行和5列):
Marker ind1 ind2 ind3 ind4
mark1 CT TT CT TT
mark2 AG AA AG AA
mark3 AC AA AC AA
mark4 CT TT CT TT
Run Code Online (Sandbox Code Playgroud)
我想要做的是将每个列(第一个coloumn除外)拆分为两列.所以输出应该像这样(4行9列):
Marker ind1 ind1 ind2 ind2 ind3 ind3 ind4 ind4
mark1 C T T T C T T T
mark2 A G A A A G A A
mark3 A C A A A C A A
mark4 C T T T C T T T
Run Code Online (Sandbox Code Playgroud)
我知道如何拆分一列
do.call(rbind,strsplit(test$JRP4RA6119.039, ""))
Run Code Online (Sandbox Code Playgroud)
这给了这个:
[,1] [,2]
[1,] "C" …Run Code Online (Sandbox Code Playgroud) 假设我生成了 10 个随机点
x <- runif(10, min = -10, max = 10)
y <- runif(10, min = -10, max = 10)
Run Code Online (Sandbox Code Playgroud)
我想计算每对点之间的距离。所以我用
d <- dist(cbind(x,y))
Run Code Online (Sandbox Code Playgroud)
我得到了一个漂亮的 9*9 矩阵。
但是,如果我使用
d1 <- dist(rbind(x,y))
Run Code Online (Sandbox Code Playgroud)
结果我只得到了 1 个数字。
谁能为我解释一下吗?
我正在尝试使用“rbind”来获取结果,但显示错误“rbind(deparse.level, ...) 中的错误:列表参数无效:所有变量都应具有相同的长度”
pm2 <- function(directory, id=1:322)
{
files <- list.files(path = directory, full.names = TRUE)
df <- data.frame()
for (i in 1:322)
{
fil <- read.csv(files[i])
df <- rbind(df, fil)
}
df2 <- data.frame(matrix(nrow = length(id), ncol = 2))
colnames(df2) <- c("id", "nobs")
for(i in id){
rbind(df2, c(df[[id[i]]],count((df[[id[i]]])),na.rm = TRUE))
}
df2
}
pm2("specdata", 1:10)
Run Code Online (Sandbox Code Playgroud) 我有一个15个变量的5个观测数据框.一些类是字符,一些是数字,一些是整数.我想在我的数据框中添加一个新行.我这样做是通过创建一个新行:
newrow= c('Chiyoda',600,.08,2,1500,1,3000,6500,10, .65, .1, 0,0,0,0)
Run Code Online (Sandbox Code Playgroud)
然后将其重新绑定到我的数据框:
mydata = rbind(mydata,newrow)
Run Code Online (Sandbox Code Playgroud)
问题是,当我执行rbind时,它会将我的数据框中每列的类更改为字符,并且我无法按照数字的方式对它们进行操作.有没有办法做到这一点,不涉及写出每个元素的类?
谢谢
我想要rbind两个数据帧,在结果data.frame中有一个额外的列,指示哪个行来自哪个data.frame.例如,
top <- mtcars[1:16, ]
bottom <- mtcars[17:32, ]
rbind(top, bottom)
Run Code Online (Sandbox Code Playgroud)
这会给我,
mpg cyl disp hp drat wt qsec vs am gear carb
Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 …Run Code Online (Sandbox Code Playgroud)