r提取具有字段名称的数据集的子集

时间:2018-12-15 00:56:33

标签: r function tidyverse

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

这是一个最小的示例: 数据框如下所示,称为“虚拟”:

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列中的数字是按顺序排列的,但不是连续的,如示例所示。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

我们可以将split s中的==listdata.frame快)

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)

答案 1 :(得分:0)

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

subjects <- c(605, 608) 

for (i in 1:length(subjects)) {

  object_name <- paste0("subject", i)
  assign(object_name, filter(dummy, A == subjects[i]))

}