r - 制作一个矩阵列表,其中每个矩阵都是数据帧的一行

标签 r matrix error-handling apply do.call

我想创建一个 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/

相关文章:

r - 如何在 R 中绘制 3D 箭头?

c - 如何在 C 中将 4x4 矩阵与 1x3 矩阵相乘?

vba - VBA 出错时如何从函数返回

wpf - 在 wpf 应用程序中创建错误日志

R - 将一个值拆分为每层内的数量

r - 我无法在 RStudio 中将文档转换为 PDF

c - 求 C 中某些矩阵元素的最大值

matlab - 在 matlab 中求解欠定方程组

python - 'datetime.datetime' 对象没有属性 'microseconds'

r - 如何在R中获取字符向量的所有可能子集?