2017-02-20 23 views
1
data(mtcars) 
mtcars <- rownames_to_column(mtcars,var = "car") 
mtcars$id <- c(1:length(mtcars$car)) 
mtcars$make <- map_chr(mtcars$car,~strsplit(.x," ")[[1]][1]) 

mt2 <- mtcars %>% select(1:4,id,make) %>% nest(-make,.key = "l") 
mt3 <- mtcars %>% select(5:10,id,make) %>% nest(-make,.key="m") 
mt_make <- left_join(mt2,mt3) 

mt2 <- mtcars %>% select(1:4,id,make) %>% nest(-id,.key = "l") 
mt3 <- mtcars %>% select(5:10,id) %>% nest(-id,.key="m") 
mt_id <- left_join(mt2,mt3) 

Как я могу фильтровать mt_make для только сохранить автомобилей с 6 цилиндров и более 150 л.с. и unnest в dataframe без listcols?фильтрация listcolumns в tidyverse

Как я могу фильтровать mt_id только сохранить Merc менее 200 л.с. и unnest в dataframe без listcols?

ответ

1

Во-первых, это не хорошие структуры данных, потому что это очень раздражает, чтобы работать параллельно, когда ваши данные должны быть связаны по горизонтали, как в нормальном data.frame. Я предполагаю, что это артефакт вашего reprex, хотя, и ваши фактические данные имеют еще одну причину, по которой они так устроены. Если нет, исправьте свою структуру для своего собственного здравомыслия.

Все, что сказал, вы можете сделать работу этих структур:

library(tidyverse) 

mt_make %>% 
    mutate(l = map(l, ~filter(.x, cyl == 6)), 
     m = map(m, ~filter(.x, hp > 150)), 
     n = map2(l, m, inner_join)) %>% # collect data where l and m have data 
    unnest(n) 

#> # A tibble: 1 × 12 
#>  make   car mpg cyl disp id hp drat wt qsec 
#>  <chr>  <chr> <dbl> <dbl> <dbl> <int> <dbl> <dbl> <dbl> <dbl> 
#> 1 Ferrari Ferrari Dino 19.7  6 145 30 175 3.62 2.77 15.5 
#> # ... with 2 more variables: vs <dbl>, am <dbl> 

mt_id %>% 
    mutate(l = map(l, ~filter(.x, make == 'Merc')), 
     m = map(m, ~filter(.x, hp < 200))) %>% 
    filter(map_int(l, nrow) == map_int(m, nrow)) %>% # assumes your data is parallel, which suggests there's no point to nesting 
    unnest() 

#> # A tibble: 7 × 12 
#>  id   car mpg cyl disp make hp drat wt qsec vs 
#> <int>  <chr> <dbl> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 
#> 1  8 Merc 240D 24.4  4 146.7 Merc 62 3.69 3.19 20.0  1 
#> 2  9 Merc 230 22.8  4 140.8 Merc 95 3.92 3.15 22.9  1 
#> 3 10 Merc 280 19.2  6 167.6 Merc 123 3.92 3.44 18.3  1 
#> 4 11 Merc 280C 17.8  6 167.6 Merc 123 3.92 3.44 18.9  1 
#> 5 12 Merc 450SE 16.4  8 275.8 Merc 180 3.07 4.07 17.4  0 
#> 6 13 Merc 450SL 17.3  8 275.8 Merc 180 3.07 3.73 17.6  0 
#> 7 14 Merc 450SLC 15.2  8 275.8 Merc 180 3.07 3.78 18.0  0 
#> # ... with 1 more variables: am <dbl> 
+1

map2 и innerjoining был совершенен. Спасибо – Misha