【问题标题】:Batch conversion of matrices into data frames in RR中将矩阵批量转换为数据帧
【发布时间】:2013-06-10 13:15:10
【问题描述】:

我有一堆需要转换为数据帧的 R 矩阵,我希望我可以自动化这个过程。

    x = matrix(rnorm(100), 10, 10)
    y = matrix(rnorm(100), 10, 10)
    z = matrix(rnorm(100), 10, 10)
    x = as.data.frame(x)
    y = as.data.frame(y)
    z = as.data.frame(z)

这不起作用:

    lapply(c('x', 'y', 'z'), function(i) assign(i, as.data.frame(get(i))))

【问题讨论】:

  • 为什么首先需要转换它们?许多运算在矩阵上比在数据帧上更快。
  • 你没有把所有的矩阵都放在一个列表中是有原因的吗?
  • @AnandaMahto 我需要在这些数据帧上使用 mapply。在我看来,矩阵不行。
  • @CravingSpirit 这是对lapply 的滥用。 *apply 系列不适用于您想要更改环境中变量状态的情况。坚持使用 for 循环来处理这些事情,for (name in c('x', 'y', 'x')) {....}
  • @MatthewPlourde 谢谢,我会这样做的。但事实证明,这也是一个更好地了解 R 环境的好机会。

标签: r data-manipulation


【解决方案1】:

不要使用lapply()。您不打算返回列表。

for (i in c('x', 'y', 'z')) assign(i, as.data.frame(get(i)))

【讨论】:

    【解决方案2】:

    如果您查看?assign 的帮助文件,您会发现如下用法:

    assign(x, value, pos = -1, envir = as.environment(pos),
           inherits = FALSE, immediate = TRUE)
    

    如果您真的想这样做,请将envir = .GlobalEnv 添加到您的assign 语句中,对象将被覆盖。

    【讨论】:

    • -1 这里的意思是把框架上移一级,即父框架?
    • 如果 x、y 和 z 不在 GlobalEnv 中而是在例如祖父母环境中,我该怎么办?
    • @CravingSpirit,您可以使用来自getenvir 参数指定从中获取它们的环境。我通常发现使用envir 而不是pos 更容易指定查看或分配的位置。
    • @CravingSpirit、example(get)example(assign)。对不起。不确定您在代码块中寻找什么。 lapply(c('x', 'y', 'z'), function(i) assign(i, as.data.frame(get(i)), envir = .GlobalEnv))?
    • 我的意思是 envir=some_specific_envir 部分,即指定它的格式是什么?谢谢!
    【解决方案3】:

    您可以很好地在矩阵上使用mapply。矩阵是具有维度属性的向量,因此在矩阵上运行mapply(只要行数和列数的乘积就会给您一个结果),然后将结果维数回正确的大小矩阵:

    x = matrix(rnorm(16), 4)
    y = matrix(rnorm(16), 4)
    z = matrix(rnorm(16), 4)
    
    matrix( mapply( sum , x , y , z ) , ncol = ncol(x) )
    #          [,1]       [,2]       [,3]       [,4]
    #[1,] -0.2707872 -1.3272743  0.4656883  0.1357950
    #[2,]  0.7026622 -0.7754597 -1.1339546 -1.2705671
    #[3,]  1.2174994  0.2062436 -0.8471821 -1.5186123
    #[4,]  3.3559925  1.7008927  1.7765929  0.4737344
    

    而且,正如已经指出的那样,它比使用 data.frames 快得多。您打算与mapply 一起使用的功能是什么?是否有某些原因这不起作用,但可以与 data.frames 一起使用?

    【讨论】:

    • 但是如果我想做这样的事情怎么办? mapply(cor, x, y)对应列的相关性。
    • @CravingSpirit 我的第一个直觉是使用sapply 来表示t( sapply( 1:ncol(x) , function(i) cor( x[,i] , y[,i] ) ) ),但您必须假设xy 在全球环境中。
    • @CravingSpirit 如果你必须指定环境来查找这些矩阵,你可以这样做t( sapply( 1:ncol(x) , function(i) cor( get("x" , env = grandparent)[,i] , get("y" , env = grandparent)[,i] ) ) )(不确定这是否是个好主意——无法决定)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    相关资源
    最近更新 更多