从嵌套列表中提取单个数据框列

Extracting single data frame column from nested list

提问人:bmacwilliams 提问时间:10/12/2023 最后编辑:Maëlbmacwilliams 更新时间:11/15/2023 访问量:82

问:

我有一个嵌套列表,其中最低级别包含一个具有多列的数据框。下面的例子。我想从中提取一个新列表,该列表仅包含数据框的第一列,在下面的示例中为“X1”,维护列表结构的其余部分。

d1 <- tibble(X1 = 1:3, X2 = 0)
d2 <- tibble(X1 = 4:6, X2 = 0)
d3 <- tibble(X1 = 7:9, X2 = 0)

L <- list(
  list(d1, d1, d1),
  list(d2, d2, d2),
  list(d3, d3, d3)
)
r list 选择 嵌套列表

评论

2赞 Ritchie Sacramento 10/12/2023
列表的深度是固定的吗?如果是这样,您可以使用(或返回 tibble)。lapply(L, lapply, `[[`, 1L)lapply(L, lapply, `[`, 1L)

答:

3赞 LMc 10/12/2023 #1
library(purrr)

modify_tree(L, leaf = ~ .x[, 1])

modify_tree如果数据帧具有不同深度,则为递归。否则,如果它始终处于相同的深度,您可以执行以下操作:

modify_depth(L, 2, ~ .x[, 1])

评论

0赞 bmacwilliams 10/13/2023
在我的真实数据中没有工作,收到这个:“!没有适用于类“C('double', 'numeric')”的对象的“select”方法。下面来自 @asd-tm 完成这项工作。谢谢。
3赞 asd-tm 10/12/2023 #2

我会提供:

lapply(L, function(x) {
  lapply(x, function(x) x$X1) 
})

我还可以建议不要用于变量名称,因为与数字相比,L 保留用于整数声明。例如。L7L

评论

0赞 Ritchie Sacramento 10/12/2023
为什么您认为解析器可能会因用作对象名称而混淆?L
0赞 asd-tm 10/13/2023
@Ritchie,解析器肯定不会混淆这个符号。我说的是编码的一般文化。 对于 R 程序员来说,有其非常具体的含义。L
3赞 Maël 10/12/2023 #3

跟。这适用于嵌套列表的任何结构:rrapply

rrapply::rrapply(
  L,
  f = \(x) x[, 1],
  classes = "data.frame"
)

输出结构:

# List of 3
# $ :List of 3
# ..$ : tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
# .. ..$ X1: int [1:3] 1 2 3
# ..$ : tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
# .. ..$ X1: int [1:3] 1 2 3
# ..$ : tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
# .. ..$ X1: int [1:3] 1 2 3
# $ :List of 3
# ..$ : tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
# .. ..$ X1: int [1:3] 4 5 6
# ..$ : tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
# .. ..$ X1: int [1:3] 4 5 6
# ..$ : tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
# .. ..$ X1: int [1:3] 4 5 6
# $ :List of 3
# ..$ : tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
# .. ..$ X1: int [1:3] 7 8 9
# ..$ : tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
# .. ..$ X1: int [1:3] 7 8 9
# ..$ : tibble [3 × 1] (S3: tbl_df/tbl/data.frame)
# .. ..$ X1: int [1:3] 7 8 9