我有一个像
这样的数据框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个矩阵。谢谢。
答案 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)
或者将apply
与MARGIN = 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