如何在 R 中的 mutate 调用中过滤列表列

How to filter a list column inside a mutate call in R

我想根据本身嵌套在列表列中的过滤数据框将变量变为列表列。

Reprex:我用的是内置钻石包

library(tidyverse)

play <- 
 diamonds %>% 
 gather(letters, value, x:z) %>% 
 nest(letters, value, .key = "nest2") %>% 
 group_by(cut) %>% 
 nest(.key = "nest1")

我现在有一个 5x2 tibble,带有 cut 列和 nest1 列表列。里面有 6 个普通变量和一个进一步的列表列 nest2

我想用 nest2 中的行数改变 nest1 中的列。我可以用

做到这一点
play_2 <- 
  play %>%
  mutate(nest1 = map(nest1, ~ mutate(.x, n_row = map_int(nest2, nrow))))
play_2$nest1[3] #to check

真正需要的是基于过滤器的 nest2 中的行数,例如nest2 != "y"。我尝试了很多子集选项,但都失败了。我确信这与 nest2 是一个 list 的事实有关,但我想不出正确的方法来处理它。

您可以使用 map_int 中的函数 sum(.x$letters != 'y') 而不是使用 nrow 来计算使用条件的行数:

play_2 <- 
    play %>%
    mutate(nest1 = map(nest1, 
        ~ mutate(.x, n_row = map_int(nest2, ~ sum(.x$letters != 'y')))
    ))

一些检查:

play_2$nest1[[1]]$n_row[[1000]]
# [1] 4

play_2$nest1[[1]]$nest2[[1000]]
# A tibble: 6 x 2
#  letters value
#  <chr>   <dbl>
#1 x        4.38
#2 x        4.34
#3 y        4.4 
#4 y        4.38
#5 z        2.73
#6 z        2.71

play_2$nest1[[2]]$n_row[[1000]]
#[1] 2

play_2$nest1[[2]]$nest2[[1000]]
# A tibble: 3 x 2
#  letters value
#  <chr>   <dbl>
#1 x        6.5 
#2 y        6.55
#3 z        3.89