dplyr中的筛选器列表变量
通常,我们如何通过dplyr中的列表变量进行过滤 例如,一个数据框,其中一个变量是不同类别对象的列表:dplyr中的筛选器列表变量,r,dplyr,R,Dplyr,通常,我们如何通过dplyr中的列表变量进行过滤 例如,一个数据框,其中一个变量是不同类别对象的列表: aa <- tibble(ss = c(1,2), dd = list(NA, matrix(data = c(1,2,3,4), nrow = 2, ncol = 2))) > aa #
aa <- tibble(ss = c(1,2),
dd = list(NA,
matrix(data = c(1,2,3,4),
nrow = 2,
ncol = 2)))
> aa
# A tibble: 2 x 2
# ss dd
# <dbl> <list>
#1 1.00 <lgl [1]>
#2 2.00 <dbl [2 × 2]>
但这又回来了
# A tibble: 0 x 2
# ... with 2 variables: ss <dbl>, dd <list>
可以使用purrr:map
对嵌套列表变量执行其他操作,但这也不起作用
> aa %>% filter(map(.x = dd,
+ .f = is.logical))
# Error in filter_impl(.data, quo) : basic_string::resize
我在这里缺少什么?我能做的最好的事情是使用
is.logical
和purrr:map
,取消列出它,按它过滤,然后取消选择该虚拟变量。行得通,但真是一团糟
aa %>%
mutate(ff = map(.x = dd,
.f = is.logical),
ff = unlist(ff)) %>%
filter(ff == TRUE) %>%
select(-ff)
# A tibble: 1 x 2
# ss dd
# <dbl> <list>
# 1 1.00 <lgl [1]>
aa%>%
变异(ff=map(.x=dd,
.f=是逻辑的),
ff=未列出(ff))%>%
过滤器(ff==真)%>%
选择(-ff)
#一个tibble:1x2
#ss dd
#
# 1 1.00
由于'dd'是一个列表
列,我们可以使用映射
循环通过'dd',但是'dd'的每个元素可以有多个元素,因此我们提出一个条件,如果所有
元素都是NA
,那么过滤数据集的行
library(tidyverse)
aa %>%
filter(map_lgl(dd, ~ .x %>%
is.na %>%
all))
# A tibble: 1 x 2
# ss dd
# <dbl> <list>
#1 1 <lgl [1]>
在OP的代码中,map
输出仍然是一个列表
,我们用map\u lgl
将其转换为一个逻辑向量。不过,它只适用于逻辑类,而我正在寻找一种过滤列表变量的通用方法。编辑问题使之成为现实clear@rubadubdub谢谢你的澄清。我更新了输出
aa %>%
mutate(ff = map(.x = dd,
.f = is.logical),
ff = unlist(ff)) %>%
filter(ff == TRUE) %>%
select(-ff)
# A tibble: 1 x 2
# ss dd
# <dbl> <list>
# 1 1.00 <lgl [1]>
library(tidyverse)
aa %>%
filter(map_lgl(dd, ~ .x %>%
is.na %>%
all))
# A tibble: 1 x 2
# ss dd
# <dbl> <list>
#1 1 <lgl [1]>
aa %>%
filter(map_lgl(dd, is.logical))
# A tibble: 1 x 2
# ss dd
# <dbl> <list>
#1 1 <lgl [1]>