我正在使用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列中的数字是按顺序排列的,但不是连续的,如示例所示。
感谢您的帮助
答案 0 :(得分:1)
我们可以将split
s中的==
(list
比data.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]))
}