【问题标题】:divide list into vectors将列表划分为向量
【发布时间】:2014-08-17 21:41:55
【问题描述】:

我有这个list

list <- list(a=1, b=1:3, c=4)

如果我取消列出它会返回以下内容:

> unlist(list)
 a b1 b2 b3  c 
 1  1  2  3  4 

有没有办法将list 分开,这样我就可以得到:

a <- 1
b <- 1:3
c <- 4

谢谢

【问题讨论】:

  • 把它命名为 not "list" 和 list2env(l, envir = .GlobalEnv)
  • 我怀疑这是一件坏事。这些对象在列表中是有原因的吗?他们应该呆在一起。以这种方式将它们分开到单独的列表中并创建命名变量是没有效率的,而且您有可能会在不注意的情况下踩到现有变量。调试地狱。但是,嘿,不能说你没有被警告过!
  • 完全正确...我已经重写了这部分以避免列表

标签: r list vector


【解决方案1】:

正如 cmets 中所指出的,这是不可取的。将这些变量从它们的列表环境中分离出来只会在我们必须跟踪的全局环境中创建更多变量。

但如果你必须这样做,你可以用assign()mapply() 做这样的事情:

> ls()
# character(0)
> X <- list(a = 1, b = 1:3, d = 4)
> invisible(mapply(function(x, y) assign(x, y, .GlobalEnv), names(X), X))
> ls()
# [1] "a" "b" "d" "X"

或者您可以在 for 循环中评估 call()&lt;-

> ls()
# character(0)
> X <- list(a = 1, b = 1:3, d = 4)
> for(i in seq_along(X)){
      eval(call("<-", names(X[i]), X[[i]]))
  }
> ls()
# [1] "a" "b" "d" "i" "X"

请注意,我使用不同的变量名来避免覆盖基本 R 函数 c()list()

【讨论】:

    【解决方案2】:

    听从 rawr 的建议,避免命名“list”、“dataframe”等对象

    使用for-loop 的非最佳解决方案,其中data 是您的列表:

    for (i in 1:length(data)) {
    assign (names(data)[i],data[[i]])
    }
    

    检查创建的对象:

    > ls()
     "a"    "b"    "c"    "data" "i"  
    > a
    [1] 1
    > b
    [1] 1 2 3
    > c
    [1] 4
    

    【讨论】:

      【解决方案3】:

      下面的代码应该做你想做的事,虽然它不是很优雅。

      count = 0
      listNames <- names(listy)
      while (count < length(listy)) {
        count = count + 1
        assign(listNames[count], listy[count])
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-26
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多