首页 > 解决方案 > 按组将 data.frame 拆分为向量列表而不是 data.frames 列表

问题描述

我有一个将一列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)

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

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

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

所以我在想这个:

df.list <- df %>%
  dplyr::group_by(group) %>%
  dplyr::group_split()

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

标签: rlistdplyrsplit

解决方案


base Rsplit. 它应该比==with更快unique

with(df, split(id, group))

或者tidyverse我们可以pullgroup_split. 返回一个 data.frame/tibble并且与上面唯一的方法group_split相比可能会更慢。split但是,在这里,我们可以通过删除 group 列 ( keep = FALSE) 然后在list' id 'pull列中list创建vector

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

{}与管道一起使用

df %>%
    {split(.$id, .$group)}

或者用with

df %>%
     with(., split(id, group))

推荐阅读