【问题标题】:r extract subset of a data set with field namer 提取具有字段名称的数据集的子集
【发布时间】:2018-12-15 00:56:33
【问题描述】:

我正在使用 R tidyverse 包来提取大型数据集的几个子集,每个子​​集都匹配特定的字段名称。然而,由于要提取的子集数量很大,并且用特定的表达式逐个提取是耗时的,并且想知道是否有更快的方法来做到这一点。

这是一个最小的例子: 数据框看起来像这样,被称为“dummy”:

A <- c(605, 605, 608, 608)
B <- c(5, 6, 3, 4)
C <- c(500, 600, 300, 400)
dummy <-as.data.frame(A, B, C)

目前我所做的是:

subject1 <- filter(dummy, A == "605")
subject2 <- filter(dummy, A == "608")

由于我的原始数据集中有 100 个受试者,这个过程很耗时,想知道是否有更快的方法来做到这一点。 我注意到 A 列中的数字是按顺序排列的,但不是连续的,如示例所示。

感谢您的帮助

【问题讨论】:

    标签: r function tidyverse


    【解决方案1】:

    我们可以将split (应该比== 更快)转换为listdata.frames

    lst1 <- split(dummy, dummy$A)
    

    注意:不建议在全局环境中创建多个对象

    一旦我们有了list,就可以更容易地处理/应用每个list 元素和lapply/sapply 等中的函数。

    lapply(lst1, function(x) colMeans(x[-1]))
    

    注意:如果是分组操作,我们不需要split

    aggregate(.~ A, dummy, FUN = mean)
    

    数据

    dummy <- data.frame(A, B, C)
    

    【讨论】:

    • 即使是伟大的@akrun 也忘记了by(可以代替split + lapply)!
    • @Parfait 我知道你非常喜欢by。对我来说(我不认为自己很棒或任何东西),by 会返回一些新格式的输出(尽管可以更改)。另外,由于某些奇怪的原因,我不记得by 尝试解决问题时
    【解决方案2】:

    您可以使用循环来执行此操作。但是,正如@akrun 所提到的,您最终可能会在全局环境中得到很多对象。例如,如果您有 200 个主题,那么您将有 200 个对象(非常混乱),也许您可​​以考虑下一步将是什么,看看您是否可以在不创建大量对象的情况下实现您想要做的事情

    subjects <- c(605, 608) 
    
    for (i in 1:length(subjects)) {
    
      object_name <- paste0("subject", i)
      assign(object_name, filter(dummy, A == subjects[i]))
    
    }
    

    【讨论】:

    • 很棒的提示。确实,在全局环境中创建了许多对象。这是清理数据的过程。我打算使用临时环境在另一个 R 文件中使用每个主题数据。
    猜你喜欢
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多