в r dplyr выберите первое наблюдение по группе и создайте список

Я хотел бы выбрать первое наблюдение в группе и создать столбец списка.

Например:

      df <- structure(list(Grp = c("A", "A", "A", "B", "B"), col1 = c(1, 
2, 3, 70, 80), col2 = c(4, 5, 6, 100, 110)), class = c("tbl_df", 
"tbl", "data.frame"), row.names = c(NA, -5L))

Я хотел бы создать столбец, первым элементом которого является c (1,4), а вторым элементом является c (70, 100).

Я пытался:

      df %>% group_by(Grp) %>% mutate(L = list(slice(1)))

Но получил ошибку.

3 ответа

Возможное решение:

      library(dplyr)

df %>% 
  group_by(Grp) %>% mutate(L = list(c(first(col1), first(col2)))) %>% 
  ungroup

#> # A tibble: 5 × 4
#>   Grp    col1  col2 L        
#>   <chr> <dbl> <dbl> <list>   
#> 1 A         1     4 <dbl [2]>
#> 2 A         2     5 <dbl [2]>
#> 3 A         3     6 <dbl [2]>
#> 4 B        70   100 <dbl [2]>
#> 5 B        80   110 <dbl [2]>

Вы можете использовать как -

      library(dplyr)

df %>%
  group_by(Grp) %>%
  mutate(L = list(slice(cur_data(), 1))) %>%
  ungroup 

#  Grp    col1  col2 L               
#  <chr> <dbl> <dbl> <list>          
#1 A         1     4 <tibble [1 × 2]>
#2 A         2     5 <tibble [1 × 2]>
#3 A         3     6 <tibble [1 × 2]>
#4 B        70   100 <tibble [1 × 2]>
#5 B        80   110 <tibble [1 × 2]>

В качестве sliceвозвращает кадр данных/тиббл, в котором он сохраняется Lстолбец как список.

Мы могли бы использовать индекс:

      library(dplyr)

df %>% 
  group_by(Grp) %>% 
  mutate(New_col = list(c(col1[1], col2[1]))) %>% 
  ungroup()
        Grp    col1  col2 New_col  
  <chr> <dbl> <dbl> <list>   
1 A         1     4 <dbl [2]>
2 A         2     5 <dbl [2]>
3 A         3     6 <dbl [2]>
4 B        70   100 <dbl [2]>
5 B        80   110 <dbl [2]>

Или, может быть:

      df %>% 
  group_by(Grp) %>% 
  mutate(New_col = toString(c(col1[1], col2[1]))) %>% 
  ungroup()
        Grp    col1  col2 New_col
  <chr> <dbl> <dbl> <chr>  
1 A         1     4 1, 4   
2 A         2     5 1, 4   
3 A         3     6 1, 4   
4 B        70   100 70, 100
5 B        80   110 70, 100
Другие вопросы по тегам