【问题标题】:Split a data.frame by group into a list of vectors rather than a list of data.frames按组将 data.frame 拆分为向量列表而不是 data.frames 列表
【发布时间】:2020-12-24 16:44:45
【问题描述】:

我有一个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 转换为list,其中每个元素是每个group 中的ids。

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

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 的列表吗?

【问题讨论】:

    标签: r list dplyr split


    【解决方案1】:

    仅将base Rsplit 一起使用。它应该比==unique 更快

    with(df, split(id, group))
    

    或者tidyverse我们可以pullgroup_split之后的列。 group_split 返回一个 data.frame/tibble,与上面的 split only 方法相比可能会更慢。但是,在这里,我们可以通过删除组列(keep = FALSE)然后在listpull 的“id”列中创建listlist 来提高性能

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

    或者用管道使用{}

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

    或者用with包装

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

    【讨论】:

      猜你喜欢
      • 2014-02-18
      • 1970-01-01
      • 2019-09-13
      • 1970-01-01
      • 2011-08-12
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多