假设我有以下数据框列表
d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6), y3=c(1,2,3))
d2 <- data.frame(y1 = c(3, 2, 1), z2 = c(6, 5, 4), y3=c(1,2,3))
d3 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6), y3=c(1,2,3))
d4 <- data.frame(y1 = c(3, 2, 1), z2 = c(6, 5, 4), y3=c(1,2,3))
d5 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6), y3=c(1,2,3))
my.list <- list(d1, d2, d3, d4, d5)
我想根据第二列的名称将这些数据框分成两个列表。也就是说,因为 d2 和 d4 的第二列与其余第二列的名称不同,所以它们应该在一个列表中,其余三个应该在另一个列表中。
答案 0 :(得分:2)
您可以通过提供列号(此处为 [
)并使用 sapply
到 2
{{} 中的 names
提取第二列1}} 根据第二列的名称。
split
答案 1 :(得分:2)
d1 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6), y3=c(1,2,3))
d2 <- data.frame(y1 = c(3, 2, 1), z2 = c(6, 5, 4), y3=c(1,2,3))
d3 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6), y3=c(1,2,3))
d4 <- data.frame(y1 = c(3, 2, 1), z2 = c(6, 5, 4), y3=c(1,2,3))
d5 <- data.frame(y1 = c(1, 2, 3), y2 = c(4, 5, 6), y3=c(1,2,3))
my.list <- list(d1, d2, d3, d4, d5)
split(my.list, sapply(my.list, \(x) names(x)[2]))
#> $y2
#> $y2[[1]]
#> y1 y2 y3
#> 1 1 4 1
#> 2 2 5 2
#> 3 3 6 3
#>
#> $y2[[2]]
#> y1 y2 y3
#> 1 1 4 1
#> 2 2 5 2
#> 3 3 6 3
#>
#> $y2[[3]]
#> y1 y2 y3
#> 1 1 4 1
#> 2 2 5 2
#> 3 3 6 3
#>
#>
#> $z2
#> $z2[[1]]
#> y1 z2 y3
#> 1 3 6 1
#> 2 2 5 2
#> 3 1 4 3
#>
#> $z2[[2]]
#> y1 z2 y3
#> 1 3 6 1
#> 2 2 5 2
#> 3 1 4 3
最后使用 list2env
会根据需要保存 2 个名称为 y2
和 z2
的列表
split(my.list, sapply(my.list, \(x) names(x)[2])) |>
list2env(envir = .GlobalEnv)