如何使用每一行的数据来循环创建矩阵

时间:2016-07-17 08:44:36

标签: r for-loop matrix

我有一个像

这样的数据框
df<-data.frame(a=c(1,2,3),b=c(4,5,6),c=c(7,8,9),d=c(10,11,12))
  a b c  d
1 1 4 7 10
2 2 5 8 11
3 3 6 9 12

我想用每一行创建3(nrow(df))2 * 2矩阵。第一次使用1,4,7,10,第二次使用2,5,8,11,第三次使用3,6,9,12。这样我就可以得到3个矩阵。谢谢。

2 个答案:

答案 0 :(得分:5)

我们可以使用split将数据集拆分为list并使用matrix

lapply(split.default(as.matrix(df), row(df)), matrix, 2)

如果我们需要矩阵列为1,7,然后是4,10,请使用byrow=TRUE

lapply(split.default(as.matrix(df), row(df)), matrix, 2, byrow=TRUE)

或者将applyMARGIN = 1一起使用并将其与list打包以获得list输出

do.call("c", apply(df, 1, function(x) list(matrix(x, ncol=2))))

如果我们需要for循环,请将a预设为list length等于'df'的行数

a <- vector("list", nrow(df))
for(i in 1:nrow(df)){ a[[i]] <- matrix(unlist(df[i,]), ncol=2)}
a

或者是否可以存储为array

array(t(df), c(2, 2, 3))

答案 1 :(得分:4)

或使用map

m <- matrix(c(t(df)), ncol = 2, byrow = T)
p <- 2 # number of rows
Map(function(i,j) m[i:j,], seq(1,nrow(m),p), seq(p,nrow(m),p))

# [[1]]
     # [,1] [,2]
# [1,]    1    4
# [2,]    7   10

# [[2]]
     # [,1] [,2]
# [1,]    2    5
# [2,]    8   11

# [[3]]
     # [,1] [,2]
# [1,]    3    6
# [2,]    9   12