我有一个包含列表列的数据框。我想用另一个列表(data
)中包含的值来过滤此(嵌套的)列表列(unit
,其中包含一个数据帧)在其包含的列x
中。我想我已经很接近了,问题是我没有成功将列表x
转换为过滤器语句的向量。非常有用!
library(tidyverse)
数据框:
df<- structure(list(data = list(structure(list(unit = c("A1", "A2"
), value = c("10", "10")), class = c("tbl_df", "tbl", "data.frame"
), .Names = c("unit", "value"), row.names = c(NA, -2L)), structure(list(
unit = c("B1", "B2", "A1"), value = c("10", "10", "10")), class = c("tbl_df",
"tbl", "data.frame"), .Names = c("unit", "value"), row.names = c(NA,
-3L)), structure(list(unit = c("C1", "B2"), value = c("10", "10"
)), class = c("tbl_df", "tbl", "data.frame"), .Names = c("unit",
"value"), row.names = c(NA, -2L))), x = list(c("A1", "A2"), c("B1",
"B2"), "C1")), class = c("tbl_df", "tbl", "data.frame"), row.names = c(NA,
-3L), .Names = c("data", "x"))
仅当x
仅具有一个元素时,此方法才有效:
df1 <- df %>%
mutate(y=map(data, ~filter(., unit %in% x)))
flatten_chr
创建一个向量,其中包含所有(!)行的x
中包含的值,而不是每行的列表。
df1 <- df %>%
mutate(y=map(data, ~filter(., unit %in% flatten_chr(x))))
关键问题似乎是如何将x
转换为每行向量。
答案 0 :(得分:1)
您可以使用map2()
来并行(即逐行)遍历data
和x
。
df %>%
mutate(y= map2(data, x, ~ filter(..1, unit %in% ..2))) # using ..1/..2 instead of .x/.y, to avoid confusion
# A tibble: 3 x 3
data x y
<list> <list> <list>
1 <tibble [2 × 2]> <chr [2]> <tibble [2 × 2]>
2 <tibble [3 × 2]> <chr [2]> <tibble [2 × 2]>
3 <tibble [2 × 2]> <chr [1]> <tibble [1 × 2]>
在这种模式下,您不再需要flatten_chr()
,因为x
/ ..2
已经是映射函数内部的字符对象。