r-使用循环将列表添加在一起



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

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

我是否可以修改代码以获得所需的结果?非常感谢您的帮助。感谢

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元素一起使用,请使用与'var1'列的unique元素的length相同的length的NULLlist进行初始化。循环遍历唯一元素的序列,并将"var2"的子集分配给"list_container"的第i个元素

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

使用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

您也可以使用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

最新更新