使用 %>% 管道中的拆分将数据框转换为列表列表

Mas*_*013 2 r dplyr magrittr

我想将数据框转换为列表列表,如下例所示:

 df <- data.frame(var1=c("A","A","A","B","B","C"),var2=seq(1,6))

 >   var1 var2
 1    A    1
 2    A    2
 3    A    3
 4    B    4
 5    B    5
 6    C    6

 split(df$var2,df$var1)

 $A
 [1] 1 2 3

 $B
 [1] 4 5

 $C
 [1] 6
Run Code Online (Sandbox Code Playgroud)

但是,我想知道是否可以使用%>%管道来完成此操作。我不知道如何split在管道中使用,其中df作为输入给出。或者也许还有另一种方法。

Tim*_*Fan 5

有几个选项,其中一些已经在评论中提到:

df <- data.frame(var1=c("A","A","A","B","B","C"),var2=seq(1,6))


# magrittr pipe
df %>% 
  {split(.$var2, .$var1)}

#> $A
#> [1] 1 2 3
#> 
#> $B
#> [1] 4 5
#> 
#> $C
#> [1] 6
  
# base pipe
df |>
  (\(x) split(x$var2, x$var1))()
#> $A
#> [1] 1 2 3
#> 
#> $B
#> [1] 4 5
#> 
#> $C
#> [1] 6

# dplyr
library(dplyr)
library(purrr)

df %>% 
group_by(var1) %>% 
  group_map(~ pull(.x, var2)) %>% 
  set_names(unique(df$var1))
#> $A
#> [1] 1 2 3
#> 
#> $B
#> [1] 4 5
#> 
#> $C
#> [1] 6
Run Code Online (Sandbox Code Playgroud)

创建于 2023-03-04,使用reprex v2.0.2


ste*_*fan 5

不是一个dplyr解决方案,但使用magrittrs “exposition” 管道%$%你可以这样做:

df <- data.frame(var1=c("A","A","A","B","B","C"),var2=seq(1,6))

library(magrittr)

df %$%
  split(var2, var1)
#> $A
#> [1] 1 2 3
#> 
#> $B
#> [1] 4 5
#> 
#> $C
#> [1] 6
Run Code Online (Sandbox Code Playgroud)