我有两个表:
df_workingFile
group v
1 a 110
2 a 90
3 b 57
4 b 53
df_groupID
group
1 a
2 b
我想从df_workingFile中将组标签的最大值提取到df_groupIDs中
df_groupID
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)它分配给现有的
df_groupIDs
表而不是创建一个新的df_groupIDs
表; (ii)仅计算出现在df_workingFile
中的组的最大值(而不是出现在?GForce
中的所有组); (iii)优化分组最大值(请参见ojit_code)。有关比较时间(更新连接与dplyr,匹配等)的示例,请参见merge data.frames based on year and fill in missing values。
关于r - 匹配两个数据框并提取最大值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45719360/