一般来说,我们如何通过 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]>
例如,如果我想过滤逻辑(尽管可以是任何东西),如果它不是一个列表,那么它会很简单:
aa %>% filter(is.logical(dd))
但是这会返回
# A tibble: 0 x 2
# ... with 2 variables: ss <dbl>, dd <list>
因为它不是第一个逻辑元素,而是第一个元素的第一个元素:
> is.logical(aa$dd[1])
# [1] FALSE
> is.logical(aa$dd[[1]])
# [1] TRUE
可以使用purrr:map
对嵌套列表变量进行其他操作,但这也不起作用。
> aa %>% filter(map(.x = dd,
+ .f = is.logical))
# Error in filter_impl(.data, quo) : basic_string::resize
我在这里缺少什么?
最佳答案
由于“dd”是一个list
列,我们可以使用map
循环遍历“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]>
<小时/>
如果这是关于基于类
的过滤
。
aa %>%
filter(map_lgl(dd, is.logical))
# A tibble: 1 x 2
# ss dd
# <dbl> <list>
#1 1 <lgl [1]>
在OP的代码中,map
输出仍然是一个list
,我们使用map_lgl
将其转换为逻辑向量
关于r - dplyr 中的过滤器列表变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50576509/