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列表吗?
使用base R只split。它应该比==with更快unique
with(df, split(id, group))
Run Code Online (Sandbox Code Playgroud)
或者tidyverse我们可以pull在group_split. 所述group_split返回一个data.frame / tibble并且可能相比较慢split上述唯一方法。但是,在这里,我们可以通过移除组列(进行一些性能方面的改进keep = FALSE),然后在list,pull在“ID”列创建list的vector小号
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)