dan*_*dan 4 split r list dplyr
我有一个data.frame
将一id
列映射到一group
列的列,并且该id
列不是唯一的,因为它id
可以映射到多个group
s:
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 中的id
s 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.frame
s列表吗?
使用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)