根据列名从列表中选择数据框

时间:2021-07-21 12:55:10

标签: r

假设我有以下数据框列表

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 的第二列与其余第二列的名称不同,所以它们应该在一个列表中,其余三个应该在另一个列表中。

2 个答案:

答案 0 :(得分:2)

您可以通过提供列号(此处为 [)并使用 sapply2 {{} 中的 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 个名称为 y2z2 的列表

split(my.list, sapply(my.list, \(x) names(x)[2])) |>
  list2env(envir = .GlobalEnv)