一般来说,我们如何在dplyr中按列表变量进行过滤?
例如,一个数据帧,其中一个变量是对象的不同类别的列表:
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]>
Run Code Online (Sandbox Code Playgroud)
例如,如果我要过滤逻辑(尽管可以是任何东西),如果它不是列表,它将像以下这样简单:
aa %>% filter(is.logical(dd))
Run Code Online (Sandbox Code Playgroud)
但这又回来了
# A tibble: 0 x 2
# ... with 2 variables: ss <dbl>, dd <list>
Run Code Online (Sandbox Code Playgroud)
因为不是逻辑上的第一个元素,所以它是第一个元素的第一个元素:
> is.logical(aa$dd[1])
# [1] FALSE
> is.logical(aa$dd[[1]])
# [1] TRUE
Run Code Online (Sandbox Code Playgroud)
可以purrr:map对嵌套列表变量执行其他操作,但这也不起作用。
> aa %>% filter(map(.x = dd,
+ .f = is.logical))
# Error in filter_impl(.data, quo) : basic_string::resize
Run Code Online (Sandbox Code Playgroud)
我在这里想念什么?
由于“ dd”是一list列,我们可以使用来遍历“ dd” map,但是“ dd”的每个元素可以有多个元素,因此我们要确定一个条件,如果all元素是NA,则filter数据集的行
library(tidyverse)
aa %>%
filter(map_lgl(dd, ~ .x %>%
is.na %>%
all))
# A tibble: 1 x 2
# ss dd
# <dbl> <list>
#1 1 <lgl [1]>
Run Code Online (Sandbox Code Playgroud)
如果这是filter基于class。
aa %>%
filter(map_lgl(dd, is.logical))
# A tibble: 1 x 2
# ss dd
# <dbl> <list>
#1 1 <lgl [1]>
Run Code Online (Sandbox Code Playgroud)
在OP的代码中,map输出仍然是a list,我们将其转换为逻辑向量map_lgl