我想创建一个 2x2 矩阵列表,其中数据帧的每一行都成为一个 2x2 矩阵。我将使用一个巨大的数据集(为了方便起见,玩具示例),因此我试图找出如何在没有 for 循环的情况下做到这一点。我一直在尝试使用自制函数和 apply() 来执行此操作,但收到错误消息。
dat<-data.frame(x1=c(2,3,4),
x2=c(1,2,3),
x3=c(5,76,7),
x4=c(4,6,0))
make_matrix<-function(df){
with(dat, matrix(c(x1,x2,x3, x4),byrow=T,nrow=2, ncol=2))
}
apply(dat, 1, FUN=make_matrix)
Error in eval(substitute(expr), data, enclos = parent.frame()) :
numeric 'envir' arg not of length one
最佳答案
我们可以使用asplit
lapply(asplit(dat, 1), matrix, 2, 2, byrow = TRUE)
-输出
#[[1]]
# [,1] [,2]
#[1,] 2 1
#[2,] 5 4
#[[2]]
# [,1] [,2]
#[1,] 3 2
#[2,] 76 6
#[[3]]
# [,1] [,2]
#[1,] 4 3
#[2,] 7 0
OP 的函数参数和主体不匹配,即它采用参数“df”,而函数内部使用 dat
。但是,这并不是唯一的问题。当我们循环遍历该行时,它是一个值向量,并且 with
对这些值不起作用。由于我们需要一个列表
,因此可以将矩阵
包装在列表
make_matrix <- function(x) list(matrix(x, byrow = TRUE, ncol = 2, nrow = 2))
应该可以
do.call(c, apply(dat, 1, make_matrix))
#[[1]]
# [,1] [,2]
#[1,] 2 1
#[2,] 5 4
#[[2]]
# [,1] [,2]
#[1,] 3 2
#[2,] 76 6
#[[3]]
# [,1] [,2]
#[1,] 4 3
#[2,] 7 0
关于r - 制作一个矩阵列表,其中每个矩阵都是数据帧的一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67390082/