新数据框列作为另一个数据框的函数(摘要)对我不起作用

2024-01-14

我想创建一个新的计算列(另一列文本的摘要)。为了让您重现,我创建了一个 df 作为可重现的示例:

df <- data.frame(name = replicate(1000, paste(sample(LETTERS, 20, replace=TRUE), collapse="")),stringsAsFactors=FALSE)

> head(df,3)
              name
1 ZKBOZVFKNJBRSDWTUEYR
2 RQPHUECABPQZLKZPTFLG
3 FTBVBEQTRLLUGUVHDKAY

现在我想要第二列,其中包含每行的“名称”列的摘要 这工作得很好,但是很慢(每个 md5 都不同,它是 name 列的相应摘要):

> df$md5 <- sapply(df$name, digest)   
> head(df, 3)
              name                              md5
1 ZKBOZVFKNJBRSDWTUEYR b8d93a9fe6cefb7a856e79f54bac01f2
2 RQPHUECABPQZLKZPTFLG 52f6acbd939df27e92232904ce094053
3 FTBVBEQTRLLUGUVHDKAY a401a8bc18f0cb367435b77afd353078

但这(使用 dplyr)不起作用,我不明白为什么:每行的 md5 都是相同的!事实上,它是完整 df$name 的摘要,包括所有行。请问有人可以向我解释一下吗?

> df <- mutate(df, md5=digest(name))
> head(df, 3)
                  name                              md5
1 ZKBOZVFKNJBRSDWTUEYR 10aa31791d0b9288e819763d9a41efd8
2 RQPHUECABPQZLKZPTFLG 10aa31791d0b9288e819763d9a41efd8
3 FTBVBEQTRLLUGUVHDKAY 10aa31791d0b9288e819763d9a41efd8

再次,如果我采用数据表方式,似乎使用新变量的标准方式不起作用:

> dt <- data.table(df)
> dt[, md5:=digest(name)]  
> head(dt,3)
                   name                              md5
1: ZKBOZVFKNJBRSDWTUEYR 10aa31791d0b9288e819763d9a41efd8
2: RQPHUECABPQZLKZPTFLG 10aa31791d0b9288e819763d9a41efd8
3: FTBVBEQTRLLUGUVHDKAY 10aa31791d0b9288e819763d9a41efd8

如果我强制分组,那么它会再次起作用(但速度很慢):

> dt[,md5:=digest(name), by=name]   
> head(dt, 3)
                   name                              md5
1: ZKBOZVFKNJBRSDWTUEYR b8d93a9fe6cefb7a856e79f54bac01f2
2: RQPHUECABPQZLKZPTFLG 52f6acbd939df27e92232904ce094053
3: FTBVBEQTRLLUGUVHDKAY a401a8bc18f0cb367435b77afd353078

我还测试了 Tapply 和工作(创建一个因素,但我的真实数据有数百万行,而且速度非常慢)。

然后,首先,有人可以向我解释为什么 dplyr mutate 不采用每行的值来计算摘要,以及为什么数据表符号会发生相同的想法(除非我分组)?

其次,是否有一种更快的方法来计算所有行的摘要?


考虑到您有一个非常大的数据集,最好在更大的数据集上测试不同的方法(在本例中,我使用 100000 行,更大的数据集在我的系统上需要很长时间):

df <- data.frame(name = replicate(1e5, paste(sample(LETTERS, 20, replace=TRUE), collapse="")), stringsAsFactors=FALSE)

首先,让我们考虑几种可用的方法:

# base R
df$md5 <- sapply(df$name, digest)

# data.table (grouping by name, based on the assumption that all names are unique)
dt[, md5:=digest(name), name]

# data.table with a unique identifier for each row
dt[,indx:=.I][, md5:=digest(name), indx]

# dplyr (grouping by name, based on the assumption that all names are unique)
df %>% group_by(name) %>% mutate(md5=digest(name))

# dplyr with rowwise (from the other answer)
df %>% rowwise() %>% mutate(md5=digest(name))

其次,测试哪种方法最快:

library(rbenchmark)
benchmark(replications = 10, order = "elapsed", columns = c("test", "elapsed", "relative"),
          baseR = df$md5 <- sapply(df$name, digest),
          dtbl1 = dt[, md5:=digest(name), name],
          dtbl2 = dt[,indx:=.I][, md5:=digest(name), indx],
          dplyr = df %>% group_by(name) %>% mutate(md5=digest(name)),
          rowwi = df %>% rowwise() %>% mutate(md5=digest(name)))

这使:

   test elapsed relative
2 dtbl1  77.878    1.000
3 dtbl2  78.343    1.006
1 baseR  81.399    1.045
5 rowwi 118.799    1.525
4 dplyr 129.748    1.666

因此,坚持使用基本 R 解决方案根本不是一个糟糕的选择。我怀疑它在真实数据集上运行缓慢的原因可能是digest函数而不是某个包/函数的某些不当行为。

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

新数据框列作为另一个数据框的函数(摘要)对我不起作用 的相关文章

随机推荐

  • Jenkins Subversion 签出失败 - “E175002:CRLF 预计在块末尾:-1/-1”

    我有一个 Jenkins v2 107 2 实例 作为 Windows 服务运行 它正在通过 Subversion 从 Visual SVN 服务器 在单独的 Windows PC 上 检查多个项目 其中一个项目 最大的 2 7GB 偶尔会
  • 如何使用 jquery 在 iframe 中选择标签?

    我试图弄清楚如何选择然后修改 HTMLiframe我生成 iframe 显示各种媒体 图像 pdf 等 为了显示不同的项目 我最初使用如下方式创建它 mydiv html 然后 根据需要 使用如下内容更新其内容 myiframe attr
  • 用于在 HTML 表中查找行索引的 jQuery 语法

    1 如何查找 HTML 表格中的行号 索引 生成的表没有任何行 ID 例如 我生成了一个纯 HTML 表格 其中有 10 行 我正在向该表动态添加行 在现有行之间 由于我要添加新行 现有的行索引将会更改 现在我需要在添加新行之前找到每行的索
  • 如何避免在 Windows 中过度填充 PATH 环境变量?

    我想知道您使用什么方法来管理系统中的可执行文件 例如 我几乎可以通过命令行访问所有内容 但现在我遇到了路径字符串的限制 因此我无法添加更多目录 那么你有什么推荐呢 很久以前 我尝试在属于该路径的目录中使用可执行文件的软链接 但这种方法不起作
  • 是否可以对两个转换字符组合使用格式修饰符?

    我知道如何使用 log4j 输出类名和方法名 这两个字段都可以单独对齐和填充 例如这个模式 d ISO8601 5p 10C 1 10M m n 产生类似的东西 2012 09 20 08 25 12 111 WARN Class meth
  • Windows 无法在本地计算机上启动 Apache CouchDB 服务

    我已在 Windows 计算机上安装了 CouchDB 但在启动 CouchDB 服务时 我收到如下消息 Windows 无法在本地计算机上启动 Apache CouchDB 服务 该服务没有返回错误 这可能是 Windows 内部错误或内
  • 使用bundle运行gitlab服务器:命令未找到错误

    我不知道发生了什么 sudo 服务 gitlab 启动 Starting both the GitLab Unicorn and Sidekiqscript web line 21 bundle command not found 查看我的
  • 如何在 cygwin 上安装 cURL?

    我尝试在 cygwin 上启用curl 但它说bash curl command not found 如何在 cygwin 上安装curl 我刚刚遇到这个 1 从以下位置找到cygwin setup exe文件http cygwin com
  • 使文本高度为 div 的 100%?

    我正在尝试使文本的高度为 100 div但它不起作用 它只是变成了100 body font size 有什么办法让它跟随div高度吗 The div高度是整个页面的 4 当您调整大小 更改分辨率时 我不希望文本跟随它 为了获得我想要的结果
  • 是否可以在打字稿中创建动态 getter/setter?

    我是 TypeScript 新手 我正在尝试将我们的应用程序从 es2016 重写为 TypeScript 我的任务是拥有一个具有数据属性的类 并使数据对象中的每个元素可用作类属性 我被这段 JavaScript 代码困住了 for let
  • Django:关闭http响应消息的控制台输出

    所以我们用 django 制作了一个应用程序 每次收到请求时它都会在控制台上打印所有这些 http 响应消息 Date String GET urlpath blah blah 200 216 Date String DELETE anot
  • jQuery 数据表问题

    当使用jQuery 数据表插件 http datatables net 为什么我会收到此错误 k 未定义 style typeof e saved aaSorting 未定义 我发布这个答案是为了记录一些东西以供自己将来参考 我希望它能对其
  • EqualityComparer.Default 不够聪明

    我正在阅读源代码EqualityComparer
  • 带有圆角的 AppWidget 图像

    因此 我通过在应用程序的主布局中向用户显示的各种视图进行动画处理 在应用程序中动态创建图像 目前 我正在相对布局中生成场景 将布局图像作为位图 然后将位图保存到 SD 以便 appwidget 通过 uri 访问 这一切都工作得很好 但是
  • 如何在Linux内核中找到sk_buff的所有者套接字?

    我正在尝试找到一个的所有者插座sk buff举例来说 skb 我的最终目标是找到特定的 TCP 选项并以某种方式让用户空间应用程序知道 我打算在找到TCP选项时设置一个套接字选项并让用户空间应用程序调用getsockopt 因此我需要知道之
  • Python 字符串转 Int 或 None

    学习Python 有点卡壳 我正在尝试将变量设置为等于int stringToInt 或者如果字符串为空则设置为None 我尝试做variable int stringToInt or None但如果字符串为空 则会出错 而不仅仅是将其设置
  • Django模型列表顺序字段更新

    我有一张桌子 比方说Book 具有以下模型定义 class Book models Model name models CharField name of the book max length 10 sequence models Int
  • System.Threading.Tasks.Dataflow 和 Microsoft.Tpl.Dataflow 之间有什么区别

    有 2 个不同的官方 TPL Dataflow nuget 包 我很困惑选择应该使用哪一个 据我了解 System Threading Tasks Dataflow 版本比其他版本稍新 而且 System Threading Tasks D
  • 警告 - 初始化使指针来自整数而不进行强制转换

    我发现了类似的问题 但我认为它们不适用于我的具体问题 所以如果它们适用 我很抱歉 我作为一年级 CS 学生正在学习 C 并尝试用 C 进行测验 但我一无所获 因为每次我尝试编译以查看它是否正常工作时 我都会收到消息 警告 初始化使指针从未经
  • 新数据框列作为另一个数据框的函数(摘要)对我不起作用

    我想创建一个新的计算列 另一列文本的摘要 为了让您重现 我创建了一个 df 作为可重现的示例 df lt data frame name replicate 1000 paste sample LETTERS 20 replace TRUE