【问题标题】:Adding lists together with a loop将列表与循环一起添加
【发布时间】:2021-08-31 18:06:56
【问题描述】:

我正在尝试使用循环将列表添加在一起。这是一些示例数据。

df <- data.frame(var1 = c(1,1,2,2,2,2,3,3,3,3,3), var2= 1:11)
> df
   var1 var2
1     1    1
2     1    2
3     2    3
4     2    4
5     2    5
6     2    6
7     3    7
8     3    8
9     3    9
10    3   10
11    3   11

我已运行此循环代码,并希望将项目存储在包含 3 个列表的文件中

list_container <- list()
for (i in  unique(df$var1) ) {
  templist <-  df[ df$var1==i , "var2"] 
  list_container <- list(list_container, templist)
}

它不起作用,最终看起来像这样

> list_container
[[1]]
[[1]][[1]]
[[1]][[1]][[1]]
list()

[[1]][[1]][[2]]
[1] 1 2

[[1]][[2]]
[1] 3 4 5 6

[[2]]
[1]  7  8  9 10 11

我想让3组列表分开放置,应该是这样的

list_result <- list(1:2, 3:6, 7:11)
> list_result
[[1]]
[1] 1 2

[[2]]
[1] 3 4 5 6

[[3]]
[1]  7  8  9 10 11

无论如何我可以修改我的代码以获得所需的结果吗?非常感谢任何帮助。谢谢

【问题讨论】:

    标签: r list loops


    【解决方案1】:

    你也可以使用unstack:

    unstack(df, var2~var1)
    $`1`
    [1] 1 2
    
    $`2`
    [1] 3 4 5 6
    
    $`3`
    [1]  7  8  9 10 11
    

    如果你不想要这些名字,你可以去掉它们:

    unname(unstack(df, var2~var1))
    [[1]]
    [1] 1 2
    
    [[2]]
    [1] 3 4 5 6
    
    [[3]]
    [1]  7  8  9 10 11
    

    【讨论】:

      【解决方案2】:

      另一个使用tapply的基本R选项

      > with(df, tapply(var2, var1, c))
      $`1`
      [1] 1 2
      
      $`2`
      [1] 3 4 5 6
      
      $`3`
      [1]  7  8  9 10 11
      

      aggregate

      > aggregate(var2 ~ ., df, c)$var2
      [[1]]
      [1] 1 2
      
      [[2]]
      [1] 3 4 5 6
      
      [[3]]
      [1]  7  8  9 10 11
      

      【讨论】:

        【解决方案3】:

        split 会更直接更快捷

        with(df, unname(split(var2, var1)))
        

        -输出

        [[1]]
        [1] 1 2
        
        [[2]]
        [1] 3 4 5 6
        
        [[3]]
        [1]  7  8  9 10 11
        

        如果我们想将==unique 元素一起使用,请使用length 的NULL list 进行初始化,这与'var1' 列的lengthunique 元素相同。循环遍历唯一元素的序列,并将“var2”的子集分配给“list_container”的ith 元素

        un1 <- unique(df$var1)
        list_container <- vector('list', length(un1))
        for(i in seq_along(un1)) 
            list_container[[i]] <- df$var2[df$var1 == un1[i]]
        

        -输出

        list_container
        [[1]]
        [1] 1 2
        
        [[2]]
        [1] 3 4 5 6
        
        [[3]]
        [1]  7  8  9 10 11
        

        【讨论】:

        • 似乎有很多方法可以做到这一点,而且所有的答案都很好。顺便说一句,感谢第二个代码,它对我的​​目的非常通用,并解释了它在做什么。非常感谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-03-26
        • 2015-01-29
        • 1970-01-01
        • 2012-12-28
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        相关资源
        最近更新 更多