我想根据过滤后的数据框将变量变更为列表列,该数据框本身嵌套在列表列中。
Reprex:我使用内置钻石包
library(tidyverse)
play <-
diamonds %>%
gather(letters, value, x:z) %>%
nest(letters, value, .key = "nest2") %>%
group_by(cut) %>%
nest(.key = "nest1")
我现在有一个带有cut
列的5x2 tibble和nest1
列表列。其中有6个正常变量和另一个列表列nest2
。
我想在nest1
中使用nest2
中的行数变异。我可以用
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
是一个列表的事实有关,但我无法弄清楚接近它的正确方法。
答案 0 :(得分:1)
您可以使用nrow
中的函数sum(.x$letters != 'y')
来使用条件来计算行数,而不是使用map_int
:
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