r - 按组将 data.frame 拆分为向量列表而不是 data.frames 列表
问题描述
我有一个将一列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)
我想将其转换data.frame
为 alist
其中每个元素都是 each 中的id
s 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.frame
s 列表吗?
解决方案
仅base R
与split
. 它应该比==
with更快unique
with(df, split(id, group))
或者tidyverse
我们可以pull
在group_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))
推荐阅读
- scala - 如何实现 Akka 演员工厂?
- javascript - 如何遍历具有数组的对象并对值求和?
- javascript - 如何使用 laravel 内置的 Gmail 验证系统发送验证电子邮件
- regex - 构建一个字符串,排除包含两个特定单词的文本
- mysql - 有没有关于这个 PyMysql/Mysql 行为的文档?
- javascript - 带有 datepicker.js 的 ToDoList 保存本地存储
- arrays - 如何在 Swift 5 中使用 typeAlias 将双字典添加到数组中
- php - 如何正确重新排序来自 HTML 的 POST 数组?
- django - 如何将 models.IntegerField() 转换为整数?
- azure-devops - 用于测试/运行天蓝色 DevOps API 查询的 HTTP GET 中的日期格式