如何在R

时间:2018-06-14 21:24:53

标签: r tidyr purrr

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

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是一个列表的事实有关,但我无法弄清楚接近它的正确方法。

1 个答案:

答案 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