如何在 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
我想根据本身嵌套在列表列中的过滤数据框将变量变为列表列。
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