r - 匹配两个数据框并取最大值

标签 r performance dataframe max

我有两个表:

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/

相关文章:

reshape 数据框以在列中创建唯一值列表

r - 如何使用 tm 包删除标点符号而不删除 R 中的句点?

r - 如何使用 Reduce 从函数列表中创建新函数?

c++ - 为什么 std::make_shared<>() 比 boost::make_shared() 有更好的性能?

python - Dataframe.to_string() 问题

python - Pandas 与独特的比赛融为一体

r - 与每列的单词列表中的单词完全匹配

javascript - CDN 托管的 javascript 库与下载和缩小

javascript - 使用 Rails 3.1 Assets 管道将 Javascript 放在文件末尾

python - 如何对连续出现的 pandas 列值的索引进行分组