在 r dplyr select 中按组进行第一次观察并创建一个列表

in r dplyr select the first observation by group and create a list

我想select将第一个观察分组并创建一个列表列。

例如:

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)))

但是出错了。

可能的解决方案:

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(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

您可以使用 slice 作为 -

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]>

A​​s slice returns a dataframe/tibble 它作为列表保存在 L 列中。