我有两个表:
df_workingFile
group v
1 a 110
2 a 90
3 b 57
4 b 53
df_groupIDs
group
1 a
2 b
我想从 df_workingFile 中提取组标签的最大值到 df_groupIDs 中
df_groupIDs
groups max
1 a 110
2 b 57
我有执行此操作的代码,但处理大型数据集时速度非常慢。
data.frame(df_groupIDs, maxValue =
sapply(df_groupIDs$group, function(newCol)
max(subset(df_workingFile, newCol == df_workingFile$group)$v)))
关于如何提高效率有什么建议吗?
最佳答案
对于 data.table,这是一个“更新连接”:
library(data.table)
setDT(df_groupIDs)
setDT(df_workingFile)
df_groupIDs[ , mx := df_workingFile[.(.SD$group), on=.(group), max(v), by=.EACHI]$V1 ]
# group mx
# 1: a 110
# 2: b 57
.SD$group
部分不是惯用的。它应该只是 .SD
,但是有一个 open bug preventing that .
工作原理
连接的语法是 x[i, on=]
,其中 i
用于根据以下条件查找 x
中的行on=
中的规则。更新的语法是 x[, var := expr]
。在这里,它们像 x[, var := x2[.SD, on=]]
一样组合,其中 .SD
指的是来自 x 的数据子集
。我们可以等效地将 expr
写成
df_workingFile[df_groupIDs, on=.(group), max(v), by=.EACHI]$V1
请参阅 ?data.table
中关于 by=.EACHI
正在做什么的文档。 V1
只是为计算结果指定的默认名称(在本例中为 max(v)
)。
性能
I have code that does this, but it's really slow with large datasets.
这种方法应该相当有效,因为 (i) 它分配给现有的 df_groupIDs
表而不是创建一个新表; (ii) 它只计算出现在 df_groupIDs
中的组的最大值(而不是出现在 df_workingFile
中的所有组); (iii) 分组最大值被优化(参见 ?GForce
)。
有关比较时间(更新连接与 dplyr、匹配等)的示例,请参阅 merge data.frames based on year and fill in missing values .
关于r - 匹配两个数据框并取最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45719360/