【问题标题】:Cbind get environment objects in RCbind在R中获取环境对象
【发布时间】:2021-12-20 02:18:53
【问题描述】:

我想使用它们名称的向量来 cbind 相同维度的向量。

例如我想从

a <- c(2, 5, NA, NA, 6, NA)
b <- c(NA, 1, 3, 4, NA, 8)

使用cbind(a,b)的矩阵

      a  b
[1,]  2 NA
[2,]  5  1
[3,] NA  3
[4,] NA  4
[5,]  6 NA
[6,] NA  8

但从环境对象名称的向量中调用变量,例如vectornames &lt;- c("a","b")

我在cbind(for(i in vectornames) get(i))上的最后一次尝试失败了

【问题讨论】:

    标签: r environment-variables


    【解决方案1】:

    你想在这里sapply/lapplyget函数。例如:

    a <- c(2, 5, NA, NA, 6, NA)
    b <- c(NA, 1, 3, 4, NA, 8)
    nmes <- c("a", "b")
    
    # Apply get() to each name in the nmes vector
    # Then convert the resulting matrix to a data frame
    as.data.frame(sapply(nms, get))
    
       a  b
    1  2 NA
    2  5  1
    3 NA  3
    4 NA  4
    5  6 NA
    6 NA  8
    

    从技术上讲,您可以使用 cbind 执行此操作,但更尴尬:

    # Convert the vector of names to a list of vectors
    # Then bind those vectors together as columns
    do.call(cbind, lapply(nms, get))
    

    【讨论】:

    • 谢谢!我对“lapply、sapply、apply、mapply”家族不是很友好。这对我很有帮助。
    • 还有mgetdo.call(cbind, mget(nmes)) ... 它更清楚地表明,尝试将对象(ab 等)保留在列表中而不是仅仅在全局环境中浮动会更好。
    【解决方案2】:

    我们可以使用mget 来“获取”一个列表,然后使用"loop-unlist"sapplyfunction(x) x[ 来创建一个矩阵

    sapply(mget(vectornames), \(x) x)
    
    #OR
    
    sapply(mget(vectornames), `[`)
    
          a  b
    [1,]  2 NA
    [2,]  5  1
    [3,] NA  3
    [4,] NA  4
    [5,]  6 NA
    [6,] NA  8
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      • 2013-09-24
      • 1970-01-01
      • 2019-08-13
      • 2017-08-01
      • 2018-10-27
      • 1970-01-01
      相关资源
      最近更新 更多