我有两个表:

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/

10-13 07:19