创建R中所有数组索引的数据帧
使用R,我试图构造一个给定矩阵行数和列数的数据帧。例如,如果创建R中所有数组索引的数据帧,r,matrix,indices,R,Matrix,Indices,使用R,我试图构造一个给定矩阵行数和列数的数据帧。例如,如果 a <- matrix(c(1:15), nrow=5, ncol=3) 我所尝试的: row <- matrix(row(a), ncol=1, nrow=dim(a)[1]*dim(a)[2], byrow=T) col <- matrix(col(a), ncol=1, nrow=dim(a)[1]*dim(a)[2], byrow=T) out <- cbind(row, col) colname
a <- matrix(c(1:15), nrow=5, ncol=3)
我所尝试的:
row <- matrix(row(a), ncol=1, nrow=dim(a)[1]*dim(a)[2], byrow=T)
col <- matrix(col(a), ncol=1, nrow=dim(a)[1]*dim(a)[2], byrow=T)
out <- cbind(row, col)
colnames(out) <- c("row", "col")
这不是我要寻找的,因为中的行和列的顺序突然颠倒,甚至我指定了“byrow=t”。我不知道我是否犯了错误,也不知道我在哪里犯了错误,但我非常感谢能给我一些建议来克服这个问题。提前谢谢 使用
行
和列
,但更直接地操作它们的输出顺序,因为它们为输入数组返回相应的索引。使用t
最终获得您想要的非默认订单:
data.frame(row = as.vector(t(row(a))), col = as.vector(t(col(a))))
row col
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3
7 3 1
8 3 2
9 3 3
10 4 1
11 4 2
12 4 3
13 5 1
14 5 2
15 5 3
或者,作为矩阵而不是data.frame:
cbind(as.vector(t(row(a))), as.vector(t(col(a))))
[,1] [,2]
[1,] 1 1
[2,] 1 2
[3,] 1 3
[4,] 2 1
[5,] 2 2
[6,] 2 3
[7,] 3 1
[8,] 3 2
[9,] 3 3
[10,] 4 1
[11,] 4 2
[12,] 4 3
[13,] 5 1
[14,] 5 2
[15,] 5 3
使用
行
和列
,但更直接地操作它们的输出顺序,因为它们为输入数组返回相应的索引。使用t
最终获得您想要的非默认订单:
data.frame(row = as.vector(t(row(a))), col = as.vector(t(col(a))))
row col
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3
7 3 1
8 3 2
9 3 3
10 4 1
11 4 2
12 4 3
13 5 1
14 5 2
15 5 3
或者,作为矩阵而不是data.frame:
cbind(as.vector(t(row(a))), as.vector(t(col(a))))
[,1] [,2]
[1,] 1 1
[2,] 1 2
[3,] 1 3
[4,] 2 1
[5,] 2 2
[6,] 2 3
[7,] 3 1
[8,] 3 2
[9,] 3 3
[10,] 4 1
[11,] 4 2
[12,] 4 3
[13,] 5 1
[14,] 5 2
[15,] 5 3
您可能想看一看
?expand.grid
,它正是您想要实现的目标。您可能想看一看?expand.grid
,它正是您想要实现的目标。我会对向量1:ncol和1:nrow使用expand.grid,然后用[,2:1]翻转列要使它们按您想要的顺序排列,请执行以下操作:
> expand.grid(seq(ncol(a)),seq(nrow(a)))[,2:1]
Var2 Var1
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3
7 3 1
8 3 2
9 3 3
10 4 1
11 4 2
12 4 3
13 5 1
14 5 2
15 5 3
我会在向量1:ncol和1:nrow上使用expand.grid,然后用[,2:1]翻转列,以获得所需的顺序:
> expand.grid(seq(ncol(a)),seq(nrow(a)))[,2:1]
Var2 Var1
1 1 1
2 1 2
3 1 3
4 2 1
5 2 2
6 2 3
7 3 1
8 3 2
9 3 3
10 4 1
11 4 2
12 4 3
13 5 1
14 5 2
15 5 3
因为有很多种方法可以剥猫皮,我将在
rep
的基础上再加入另一种变体:
data.frame(row=rep(seq(nrow(a)), each=ncol(a)), col=rep(seq(ncol(a)), nrow(a)))
…但要宣布“获胜者”,我认为你需要确定解决方案的时间:
# Make up a huge matrix...
a <- matrix(runif(1e7), 1e4)
system.time( a1<-data.frame(row = as.vector(t(row(a))),
col = as.vector(t(col(a)))) ) # 0.68 secs
system.time( a2<-expand.grid(col = seq(ncol(a)),
row = seq(nrow(a)))[,2:1] ) # 0.49 secs
system.time( a3<-data.frame(row=rep(seq(nrow(a)), each=ncol(a)),
col=rep(seq(ncol(a)), nrow(a))) ) # 0.59 secs
identical(a1, a2) && identical(a1, a3) # TRUE
#组成一个巨大的矩阵。。。
a既然有很多种方法可以剥猫皮,我将在rep
的基础上再加入另一种变体:
data.frame(row=rep(seq(nrow(a)), each=ncol(a)), col=rep(seq(ncol(a)), nrow(a)))
…但要宣布“获胜者”,我认为你需要确定解决方案的时间:
# Make up a huge matrix...
a <- matrix(runif(1e7), 1e4)
system.time( a1<-data.frame(row = as.vector(t(row(a))),
col = as.vector(t(col(a)))) ) # 0.68 secs
system.time( a2<-expand.grid(col = seq(ncol(a)),
row = seq(nrow(a)))[,2:1] ) # 0.49 secs
system.time( a3<-data.frame(row=rep(seq(nrow(a)), each=ncol(a)),
col=rep(seq(ncol(a)), nrow(a))) ) # 0.59 secs
identical(a1, a2) && identical(a1, a3) # TRUE
#组成一个巨大的矩阵。。。
a smarty裤子的名字呢?expand.grid(col=seq(ncol(a)),row=seq(nrow(a))[,2:1]smarty裤子的名字呢?expand.grid(col=seq(ncol(a)),row=seq(nrow(a)))[,2:1]