首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >过滤嵌套的数据框(列表列),覆盖列表中的值,使用purrr

过滤嵌套的数据框(列表列),覆盖列表中的值,使用purrr
EN

Stack Overflow用户
提问于 2019-02-06 21:55:19
回答 1查看 677关注 0票数 1

我有一个包含列表列的数据帧。我想用另一个列表(x)中包含的值来过滤它所包含的列unit上的这个(嵌套的)列表列(data,包含一个数据帧)。我想我已经很接近了,问题是我没有成功地将列表x‘转换’成过滤器语句的向量。对任何提示都很有用!

代码语言:javascript
运行
AI代码解释
复制
library(tidyverse)

数据帧:

代码语言:javascript
运行
AI代码解释
复制
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只有一个元素时,这才有效:

代码语言:javascript
运行
AI代码解释
复制
df1 <- df %>% 
  mutate(y=map(data, ~filter(., unit %in% x)))

flatten_chr创建一个矢量,其中包含x of all (!)中包含的值行,而不是每行的列表。

代码语言:javascript
运行
AI代码解释
复制
df1 <- df %>% 
  mutate(y=map(data, ~filter(., unit %in% flatten_chr(x))))

关键问题似乎是如何将x转换为每行的向量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-02-09 17:42:39

您可以使用map2()来并行迭代datax,即逐行迭代。

代码语言:javascript
运行
AI代码解释
复制
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已经是映射函数中的一个字符对象。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54563142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档