按组将 data.frame 拆分为向量列表而不是 data.frames 列表

dan*_*dan 4 split r list dplyr

我有一个data.frame将一id列映射到一group列的列,并且该id列不是唯一的,因为它id可以映射到多个groups:

set.seed(1)
df <- data.frame(id = paste0("id", sample(1:10,300,replace = T)), group = c(rep("A",100), rep("B",100), rep("C",100)), stringsAsFactors = F)
Run Code Online (Sandbox Code Playgroud)

我想将其转换data.frame为 a list,其中每个元素都是 each 中的ids group

对于我正在处理的数据大小,这似乎有点慢:

library(dplyr)
df.list <- lapply(unique(df$group), function(g) dplyr::filter(df, group == g)$id)
Run Code Online (Sandbox Code Playgroud)

所以我在想这个:

df.list <- df %>%
  dplyr::group_by(group) %>%
  dplyr::group_split()
Run Code Online (Sandbox Code Playgroud)

假设它比我的第一个选项快,知道如何让它返回与第一个选项相同的输出而不是data.frames列表吗?

akr*_*run 5

使用base Rsplit。它应该比==with更快unique

with(df, split(id, group))
Run Code Online (Sandbox Code Playgroud)

或者tidyverse我们可以pullgroup_split. 所述group_split返回一个data.frame / tibble并且可能相比较慢split上述唯一方法。但是,在这里,我们可以通过移除组列(进行一些性能方面的改进keep = FALSE),然后在listpull在“ID”列创建listvector小号

library(dplyr)
library(purrr)
df %>%
     group_split(group, keep = FALSE) %>% 
     map(~ .x %>%
             pull(id))
Run Code Online (Sandbox Code Playgroud)

{}与管道一起使用

df %>%
    {split(.$id, .$group)}
Run Code Online (Sandbox Code Playgroud)

或者用 with

df %>%
     with(., split(id, group))
Run Code Online (Sandbox Code Playgroud)