提问人:bmacwilliams 提问时间:10/12/2023 最后编辑:Maëlbmacwilliams 更新时间:11/15/2023 访问量:82
从嵌套列表中提取单个数据框列
Extracting single data frame column from nested list
问:
我有一个嵌套列表,其中最低级别包含一个具有多列的数据框。下面的例子。我想从中提取一个新列表,该列表仅包含数据框的第一列,在下面的示例中为“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)
)
答:
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 保留用于整数声明。例如。L
7L
评论
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
评论
lapply(L, lapply, `[[`, 1L)
lapply(L, lapply, `[`, 1L)