当前位置: 首页 > 知识库问答 >
问题:

dplyr:子分组(group_by)数据帧上的colSums:优雅地

鲜于阳
2023-03-14
countData <- sample(0:10, 2000, replace = TRUE)
dates <- sample(seq(as.Date("2010/1/1"), as.Date("2010/01/30"), "days"), 200, replace = TRUE)
locality <- sample(1:2, 2000, replace = TRUE)
ageCat <- sample(1:2, 2000, replace = TRUE)
sampleDF <- data.frame(dates, locality, ageCat, matrix(countData, nrow = 200, ncol = 10))

我想做的是...

library("dplyr")
sampleDF %.% group_by(locality, ageCat, dates) %.% do(colSums(.[, -(1:3)]))

但是这并不完全有效,因为colSums()的结果不是数据帧。如果我投了它,它就起作用了:

sampleDF %.% group_by(locality, ageCat, dates) %.% do(data.frame(matrix(colSums(.[, -(1:3)]), nrow = 1, ncol = 10)))

但最后做(...)比特似乎很笨拙。

我没有费心进行复制,只是使用system.time()获得了一个粗略的度量。从外观上看,dplyr和data.table在我的数据集上的表现大致相同,而且如果使用得当,两者都比我昨天提出的hack解决方案要快得多。

共有1个答案

魏鸿禧
2023-03-14

除非我遗漏了什么,否则这似乎是summarise_each的工作(类似于plyr中的colwise):

sampleDF %.% group_by(locality, ageCat, dates) %.% summarise_each(funs(sum))

grouping列默认情况下不包括在汇总函数中,您只能选择一个列子集来应用函数,使用与使用select相同的技术。

(据我所知,summarise_each在dplyr的0.2版本中,但不在0.1.3版本中。)

 类似资料:
  • 如果我想从不同的组中随机选择一些样本,我使用plyr包和下面的代码 这里从每个物种中选取10个样本。 我的一些数据帧非常大,我的问题是我可以对dplyr包使用相同的srovGroup函数吗?或者有另一种方法可以在dplyr中做同样的事情? 编辑 dplyr 包的 0.2 版引入了两个新功能,用于从表中选择随机行sample_n和sample_frac

  • 我有一个熊猫数据框,如下所示。 我根据按数据帧分组。分组数据框在概念上如下所示。 现在,我正在寻找一个内置API,它将给我最大作业数的。对于上面的示例,-2具有最大计数。 更新:我希望具有最大作业计数,而不是具有最大作业计数的。对于上述示例,如果,则输出为。这能做到吗?

  • 我需要创建一个具有特定形状的空数据框,例如[10,10],以存储来自其他源的数据。 在熊猫中很简单: 但在红宝石使用达鲁,我不知道如何做到这一点。 相关问题:熊猫数据帧

  • 问题内容: 我有一个如下所示的pandas数据框,并通过一列保存数据组: 现在,我想创建新的数据框(名为df_w,df_x,df_y,df_z),这些数据框仅保存其原始数据中的数据,并在一些可迭代的列表(例如列表)中进行最佳组合: 有没有使用groupby,apply和/或applymap和函数来实现此目的的智能(矢量化熊猫)方法? 我当时正在考虑对数据框进行迭代,但这似乎不是很优雅。 预先感谢您

  • 我试过了 但这行不通。在我最初的方法中,我通过将每周编号1-4的dataframe与我的rawdata文件合并来解决这个问题。这样,我每篇文章有4周的时间(行),但是使用for循环的实现效率非常低,所以我试图用dplyr(或任何其他更高效的包/函数)做同样的事情。任何建议都将不胜感激!

  • 首先,请让我知道我正在做的是不是对dplyr的不当使用,因为我不确定我是否以最佳方式实现了这一点。我有以下数据帧: 我想做的过滤有点罗嗦,但我会尝试-我想通过删除col1 == '0 '的所有行来过滤数据帧,如果该行出现在该用户的第一行之后,其中col1 == '1 '。(粗体表示我把原问题搞砸了,把0和1调换了)。 例如,对于用户7,第3行的col1 == '1 ',所以我想过滤第3行之后col