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
# 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/

相关文章:

r - 如何编写一个函数来创建用于 ggplot2 的自定义误差线?

R 从时间中获取特定的小时

r - 打印包含 S4 对象列表列的 data.frame

r - dplyr .data 代词与 "quosure"方法

r rowSums in case_when

将 txt 文件的目录逐行读取到 R 数据框中,文件名作为一列

R:自动扩展VIM::aggr图中的边距

java - 使用 xlsx 在 R 中打开 Excel 文件时出错

r - 组内唯一ID

mysql - 从Mysql中获取特定条件的数据