我有一个如下所示的函数。
f1<-function(x)
{
df1 <- rowSums(x)
df2 <- colSums(x)
return(list(Actuals = df1,Summary = df2))
}
我按组调用该函数,如下所示。
out <- by( mtcars, INDICES = mtcars$gear, f1, simplify = TRUE )
现在,我只需要从所有组中获取Summary,并将它们合并到一个 Dataframe 中。
我可以用下面的代码来做。
summary <- do.call( rbind, sapply( out, function(x) x$Summary, simplify = FALSE ) )
summary <- cbind( Gear = as.integer( row.names(summary) ), summary )
但是这个过程非常慢。我的原始数据集中有数千个组,这种方法大约需要20分钟才能完成。
有谁能提供一个更好的data.table
或其他包的方法吗?
先谢了。
1条答案
按热度按时间6jjcrrmo1#
即使有数万个组,当前解决方案中的整形操作也只需要几秒钟,我怀疑几乎所有的处理时间都花在了实际的
f1
函数上。下面是使用
data.table
完成(本质上)相同任务的一种方法,它的运行速度大约是data.table
的两倍。f1
函数(根据注解“f1
函数只是一个示例。我有非常冗长和复杂的函数。但以列表格式返回两个 Dataframe 。”修改):修改
f1
以返回嵌套列表。制作一个更大的数据集进行说明。
原始溶液:
data.table
溶液:请注意,
[, f2(.SD), gear]
操作不会将分组变量传递给f2
,因此gear
不会出现在summary2
中。可能需要根据f1
函数的实际操作来修改该操作。