通过求和来聚合重复行

2024-01-20

根据我的问题:
1. 识别一组变量是否唯一标识数据的每一行; https://stackoverflow.com/q/22834725/1414455
2. 根据给定的变量集标记所有重复的行, https://stackoverflow.com/q/22893028/1414455
我现在想通过求和来聚合/合并给定变量集的所有重复行。

解决方案一:

有一些关于如何执行此操作的指导here https://stackoverflow.com/q/10180132/1414455,但当构成指标的变量级别较多时,ddply推荐的方法很慢,因为在我试图通过给定的变量集标记所有重复项的情况下。

# Values of (f1, f2, f3, f4) uniquely identify observations
dfUnique = expand.grid(f1 = factor(1:16),
                       f2 = factor(1:41),
                       f3 = factor(1:2),
                       f4 = factor(1:104))

# sample some extra rows and rbind them
dfDup = rbind(dfUnique, dfUnique[sample(1:nrow(dfUnique), 100), ])

# dummy data 
dfDup$data = rnorm(nrow(dfDup))

# aggregate the duplicate rows by taking the sum
dfDupAgg = ddply(dfDup, .(f1, f2, f3, f4), summarise, data = sum(data))

解决方案2:

第二种解决方案是使用data.table,并遵循建议here https://stackoverflow.com/a/12399304/1414455, 我可以

# data.table solution
indexVars = paste0('f', 1:4, sep = '')
dtDup = data.table(dfDup, key = indexVars)
dtDupAgg = dtDup[, list(data = sum(data)), by = key(dtDup)]

我有一些问题:
1.有没有办法让ddply版本更快?
2. 是data.table正确的?我想检查一下,因为我是新手data.table.


关于你的data.table解决方案,你不需要set key用于聚合操作。您可以直接执行:

indexVars = paste0('f', 1:4, sep = '')
dtDup <- as.data.table(dfDup) ## faster than data.table(.)
dtDupAgg = dtDup[, list(data = sum(data)), by = c(indexVars)]

data.table1.9.2+版本还实现了一个功能setDT这使得能够转换data.frames to data.tables 引用(这意味着没有副本,因此转换几乎不需要时间,对于大型数据帧尤其有用)。

因此,不要这样做:

dtDup <- as.data.table(dfDup)
dtDup[...]

你可以这样做:

## data.table v1.9.2+
setDT(dfDup) ## faster than as.data.table(.)
dfDup[...]   ## dfDup is now a data.table, converted by reference

关于你的第一个问题,plyr不以其速度而闻名。查看为什么plyr这么慢? https://stackoverflow.com/questions/11533438/why-is-plyr-so-slow(以及那里的许多信息丰富的评论)了解更多信息。

也许您可能感兴趣dplyr,这比plyr,但仍然慢于data.table, 恕我直言。这是等效的dplyr版本:

dfDup %.% group_by(f1, f2, f3, f4) %.% summarise(data = sum(data))

这是之间的基准data.table and dplyr数据(所有计时均为连续三次运行的最小值):

## data.table v1.9.2+
system.time(ans1 <- dtDup[, list(data=sum(data)), by=c(indexVars)])
#  user  system elapsed 
# 0.049   0.009   0.057 

## dplyr (commit ~1360 from github)
system.time(ans2 <- dfDup %.% group_by(f1, f2, f3, f4) %.% summarise(data = sum(data)))
#  user  system elapsed 
# 0.374   0.013   0.389 

我实在是没有耐心去跑plyr版本(首次运行 93 秒后停止)。如你看到的dplyrplyr,但比慢约 7 倍data.table here.


检查结果是否相等以确保:

all.equal(as.data.frame(ans1[order(f1,f2,f3,f4)]), 
          as.data.frame(ans2))
# [1] TRUE

HTH

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

通过求和来聚合重复行 的相关文章

随机推荐

  • 嵌入式 Jetty 9 一次处理一个请求

    我在嵌入式模式下使用 jetty 9 尽管我已经给出了threadpool500 的服务器仍然一次只处理一个请求 我缺少什么 Java代码 这里我期望所有线程名称日志可以即时打印 但它们是一张一张打印的 public class Main
  • iOS 音频单元 - 创建立体声正弦波

    周末我在学习如何在 iOS 上进行音频合成编程时遇到了障碍 我在 iOS 上进行开发已经好几年了 但我刚刚进入音频合成方面 现在 我只是编写演示应用程序来帮助我学习这些概念 我目前已经能够在音频单元的播放渲染器中构建和堆叠正弦波 没有任何问
  • LOCAL_LDLIBS 与 LOCAL_LDFLAGS

    Android NDK 指南解释了以下两个变量Adnroid mk如下 LOCAL LDLIBS 构建共享库或可执行文件时要使用的附加链接器标志列表 LOCAL LDFLAGS 构建共享库或可执行文件时要使用的其他链接器标志的列表 那么这两
  • 电子邮件地址中可以有撇号吗? [复制]

    这个问题在这里已经有答案了 可能的重复 电子邮件地址中允许使用哪些字符 https stackoverflow com questions 2049502 what characters are allowed in email addre
  • “弧形移植”和“弧形修补”有什么区别?

    arc help full less揭示了这一点graft graft revision Grafts revision and its dependencies if any onto your working tree force Do
  • 从 Python 字典中删除 None 值

    Python 新手 所以这可能看起来很愚蠢 我有两个命令 default a alpha b beta g Gamma user a NewAlpha b None 我需要使用用户中存在的值更新我的默认值 但仅适用于那些值不等于 None
  • 如何转义 YAML 字符串中的冒号和其他特殊字符?

    我有以下 YAML 片段 description API for bean consuming applications Examples painted pony lima bean 招摇编辑器 http editor swagger i
  • 函数调用的正则表达式?

    我只想从函数调用中提取一些引用的文本 并且想知道是否可以获得有关正则表达式的帮助 该字符串看起来像这样 MyFunction MyStringArg 本质上 我想扫描文件中任何调用 MyFunction 的行 然后捕获引号内的字符串文字 后
  • 使用正则表达式验证数学表达式?

    我想使用正则表达式验证数学表达式 数学表达式可以是这样的 可以为空 表示没有输入任何内容 如果指定 它将始终以运算符开头 or or or 并且后面总是跟着一个可以有的数字 任意位数且数字可以是小数 包含 数字之间 或整数 数字中没有 符号
  • 使用 if 语句检查 mousedown 是否有效?

    是否可以做这样的事情 if this mousedown true 我以为这会起作用 但事实并非如此 额外细节 我试图检查当鼠标离开特定位置时鼠标按钮是否按下DIV 因此如果用户在鼠标离开 div 时按住鼠标按钮 则执行此操作 否则执行此操
  • EditText 不接受数字输入

    我的 Android 应用程序中有一个 EditText 视图 我的 EditText 不采用整数值作为输入 但它采用所有其他值 以下是我的 EditText 视图
  • 对齐子图中的 ylabel

    我有几个子图 一个在另一个下 每个子图的 y 轴都标有不同的值 比如第一个是 1 5 第二个是 10 1000 等 所以结果是每个 ylabel 都会有不同的对齐方式 有没有办法来解决这个问题 例如 将所有 ylabel 向左对齐 或者还有
  • 为什么 eval 是邪恶的?

    我知道Lisp和Scheme程序员通常会这么说eval除非绝对必要 否则应避免 我已经看到了对几种编程语言的相同建议 但我还没有看到反对使用的明确论据列表eval 在哪里可以找到使用潜在问题的说明eval 例如 我知道以下问题GOTO在过程
  • 卷曲:连接被拒绝

    运行curl时出现以下错误 curl 7 连接127 0 0 1端口8080失败 连接 拒绝了 看起来很容易调试 但是 我没有找到如何解决它 文件中提到了地址127 0 0 1etc hosts 我在Ubuntu系统上使用curl版本7 4
  • 如何从 Sinch 应用仪表板删除上传的 APNS 证书?

    我们正在开发呼叫应用程序使用新奇SDK 我想从 Sinch Dashboard 中创建的应用程序中删除上传的 APNS 证书 我没有找到任何方法来从中删除现有的上传证书 NOTE 现在sinch在App上传的认证附近提供了 删除 选项 No
  • 如何使用java脚本向“go服务器”(go语言)发送json请求并接收json响应

    如何使用java脚本发布json请求并从 go服务器 go语言 接收json响应 我试过这个 JavaScript 代码 var calculate operand1 null operand2 null operator null fun
  • 内核中的地址

    当我在内核中找到地址时 我有一个问题 我在内核中插入一个 hello 模块 在这个模块中 我放置了这些东西 char mystring this is my address printk lt 1 gt The address of mys
  • Momentjs:如何将一个时区的日期/时间转换为 UTC 日期/时间

    我有一个带有时区的日期 时间 并且想将其转换为 UTC const date 2019 04 10T20 30 00Z const zone Asia Kuala Lumpur const utcDate moment date tz zo
  • 在 MATLAB 中拆分数组

    我有一个整数数组 我想在 0 出现的地方分割这个数组 并有一个函数给我分割点 示例 数组 0 0 0 1 2 4 5 6 6 0 0 0 0 0 22 4 5 6 6 0 0 0 4 4 0 该函数必须返回这些数字 3 10 14 20 2
  • 通过求和来聚合重复行

    根据我的问题 1 识别一组变量是否唯一标识数据的每一行 https stackoverflow com q 22834725 1414455 2 根据给定的变量集标记所有重复的行 https stackoverflow com q 2289