将 ddply + mutate 与自定义函数一起使用?

2024-04-29

I use ddply相当频繁,但历史上有summarize(偶尔mutate)并且只有基本功能,例如mean(), var1 - var2等等。我有一个数据集,我试图在其中应用一个自定义的、更复杂的函数,并开始尝试深入研究如何做到这一点ddply。我有一个成功的解决方案,但我不明白why它的工作原理与更多“正常”功能相比是这样的。

Related

  • ddply {plyr} 无法识别自定义函数... https://stackoverflow.com/questions/11556877/custom-function-not-recognized-by-ddply-plyr-it-tells-me-that-my-function-is
  • 如何将变量传递给 ddply 中的自定义函数? https://stackoverflow.com/questions/20845409/how-do-i-pass-variables-to-a-custom-function-in-ddply
  • r-help: [R] 正确使用 ddply 及其自身功能 http://grokbase.com/t/r/r-help/1255y8qvty/r-correct-use-of-ddply-with-own-function(我最终的解决方案基于此)

这是一个示例数据集:

library(plyr)
df <- data.frame(id = rep(letters[1:3], each = 3),
                 value = 1:9)

通常情况下,我会使用ddply像这样:

df_ply_1 <- ddply(df, .(id), mutate, mean = mean(value))

我对此的想象是ddply splits df基于分组组合的“迷你”数据框id,然后我通过调用添加一个新列mean()在存在于的列名上df。因此,我尝试实现一个函数扩展了这个想法:

# actually, my logical extension of the above was to use:
# ddply(..., mean = function(value) { mean(value) })
df_ply_2 <- ddply(df, .(id), mutate,
                  mean = function(df) { mean(df$value) })

Error: attempt to replicate an object of type 'closure'

有关自定义函数的所有帮助均不适用mutate,但这似乎不一致,或者至少让我烦恼,因为我实现的解决方案的模拟是:

df_mean <- function(df) {
    temp <- data.frame(mean = rep(mean(df$value), nrow(df)))
    temp
}

df_ply_3 <- df
df_ply_3$mean <- ddply(df, .(id), df_mean)$mean

在线,看来我必须这样做:

df_ply_4 <- df
df_ply_4$mean <- ddply(df, .(id), function(x) {
    temp <- data.frame(mean = rep(mean(x$value), length(x$value)))
    temp})$mean

为什么我不能使用mutate具有自定义功能?难道只是“内置”函数返回某种类ddply可以处理与必须踢出一个完整的data.frame然后只调出我关心的栏目?

感谢您帮助我“得到它”!


@Gregor 回答后更新

很棒的答案,我想我现在明白了。我确实很困惑mutate and summarize意味着......认为他们是论据ddply关于如何处理结果与实际情况being函数本身。所以,感谢您的深刻见解。

而且,它确实有助于理解这一点without mutate/summarize,我需要返回一个data.frame,这就是我必须这样做的原因cbind具有列名称的列df得到返回。

最后如果我do use mutate,现在意识到我可以返回向量结果并获得正确的结果是有帮助的。于是,我can这样做,在阅读您的答案后我现在已经理解了:

# I also caught that the code above doesn't do the right thing
# and recycles the single value returned by mean() vs. repeating it like
# I expected. Now that I know it's taking a vector, I know I need to return
# a vector the same length as my mini df
custom_mean <- function(x) {
    rep(mean(x), length(x))
}

df_ply_5 <- ddply(df, .(id), mutate,
              mean = custom_mean(value))

再次感谢您的深入解答!


根据 @Gregor 的最后评论更新

嗯。我用了rep(mean(x), length(x))由于这一观察df_ply_3的结果(我承认当我第一次运行它时并没有仔细观察它,我只是看到它没有给我一个错误!):

df_mean <- function(x) {
    data.frame(mean = mean(x$value))
}

df_ply_3 <- df
df_ply_3$mean <- ddply(df, .(id), df_mean)$mean

df_ply_3
  id value mean
1  a     1    2
2  a     2    5
3  a     3    8
4  b     4    2
5  b     5    5
6  b     6    8
7  c     7    2
8  c     8    5
9  c     9    8

所以,我认为我的代码实际上是一个意外,因为我有 3id变量重复 3 次。因此实际回报相当于summarize(每行一行id值),并进行回收。如果我像这样更新数据框,测试该理论似乎是准确的:

df <- data.frame(id = c(rep(letters[1:3], each = 3), "d"),
                 value = 1:10)

我在尝试使用时遇到错误df_ply_3方法与df_mean():

Error in `$<-.data.frame`(`*tmp*`, "mean", value = c(2, 5, 8, 10)) : 
  replacement has 4 rows, data has 10

所以,迷你 df 传递给df_mean返回一个df where mean是取平均值的结果,如果value向量(返回一个值)。所以,我的输出只是一个data.frame三个值,每个值一个id团体。我在想mutate有点“记住”它传递了一个迷你数据帧,然后重复单个输出以匹配它的长度?

无论如何,感谢您的评论df_ply_5;事实上,如果我删除rep()一点然后返回mean(x),效果很好!


你基本上是对的。ddply确实根据石斑鱼将您的数据分解为迷你数据帧,并对每个数据帧应用一个函数。

With ddply,所有工作都是通过数据框完成的,所以.fun争论must将(迷你)数据帧作为输入并返回数据帧作为输出。

mutate and summarize是符合此要求的函数(它们获取并返回数据帧)。您可以查看他们各自的帮助页面,或者在外部的数据框架上运行它们ddply看到这个,例如

mutate(mtcars, mean.mpg = mean(mpg))
summarize(mtcars, mean.mpg = mean(mpg))

If you don't use mutate or summarize, 那是你only使用自定义函数,那么您的函数还需要采用(迷你)数据帧作为参数,并返回一个数据帧。

If you do use mutate or summarize,您传递给的任何其他函数ddply不被使用ddply,它们只是被传递给使用mutate or summarize。以及使用的函数mutate and summarize作用于数据的列,而不是整个 data.frame。这就是为什么

ddply(mtcars, "cyl", mutate, mean.mpg = mean(mpg))

注意我们没有通过mutate一个函数。我们不说ddply(mtcars, "cyl", mutate, mean)。我们必须告诉它取什么意思。在?mutate,描述...是“给出新列定义的命名参数”,与函数无关。 (是mean()真的与任何“自定义功能”不同吗?不。)

因此它不适用于匿名函数——或者根本不适用于函数。传递一个表情!您可以预先定义自定义函数。

custom_function <- function(x) {mean(x + runif(length(x))}
ddply(mtcars, "cyl", mutate, jittered.mean.mpg = custom_function(mpg))
ddply(mtcars, "cyl", summarize, jittered.mean.mpg = custom_function(mpg))

这很好地扩展了,您可以拥有接受多个参数的函数,并且可以为它们提供不同的列作为参数,但是如果您使用mutate or summarize,你必须给其他函数参数;你不只是传递函数。

你似乎想通过ddply已经“知道”要取哪一列的平均值的函数。为此,我认为你需要not use mutate or summarize,但你可以破解你自己的版本。为了summarize-类似行为,返回具有单个值的 data.frame,对于mutate-类似行为,返回带有额外值的原始 data.framecbinded on

mean.mpg.mutate = function(df) {
    cbind.data.frame(df, mean.mpg = mean(df$mpg))
}

mean.mpg.summarize = function(df) {
    data.frame(mean.mpg = mean(df$mpg))
}

ddply(mtcars, "cyl", mean.mpg.mutate)
ddply(mtcars, "cyl", mean.mpg.summarize)

tl;dr

为什么我不能将 mutate 与自定义函数一起使用?难道只是“内置”函数返回某种 ddply 可以处理的类,而不是必须踢出完整的 data.frame,然后只调用我关心的列?

恰恰相反!mutate and summarize将数据帧作为输入并踢出数据帧作为返回。但变异和总结are您传递给 ddply 的函数,没有恶意或其他什么意思。

Mutate 和 Summarize 是您 99% 的时间都会用到的便利函数ddply.

如果您不使用 mutate/summarize,那么您的函数需要获取并返回一个数据帧。

如果您确实使用 mutate/summarize,那么您不会向它们传递函数,而是向它们传递可以使用(迷你)数据框进行评估的表达式。如果它是变异的,则返回应该是一个要附加到数据的向量(根据需要回收)。如果是汇总,则返回应该是单个值。你没有传递一个函数,比如mean;你传递一个表达式,比如mean(mpg).


关于什么dplyr?

这是之前写过的dplyr是一件事,或者至少是一件大事。dplyr消除了这个过程中的很多混乱,因为它本质上取代了嵌套ddply with mutate or summarize作为顺序函数的参数group_by其次是mutate or summarize. The dplyr我的答案的版本是

library(dplyr)
group_by(mtcars, cyl) %>%
    mutate(mean.mpg = mean(mpg))

随着新列的创建直接传递给mutate (or summarize),对于哪个函数的作用并不存在混淆。

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

将 ddply + mutate 与自定义函数一起使用? 的相关文章

  • 通过 rpy 将 SPSS 文件(.sav)导入 pandas 时如何保留标签?

    我正在寻找使用 SPSS 文件 sav pandas 在没有 SPSS 程序的情况下 典型文件转换为 csv 后的样子如下 在调查前两行的含义时 我不知道 SPSS 似乎第一行包含Labels 而第二行包含VarNames 当我将文件带入
  • 为什么 as.character() 返回日期列表中的整数?

    我惊讶地发现 R 中出现以下行为 as character c Sys Date gt 1 2018 02 05 as character list Sys Date gt 1 17567 为什么会出现这种情况 也就是说 显然 17567
  • 如何导入 .tsv 文件

    我需要读取一个表 tsvR 中的文件 test lt read table file drug info tsv Error in scan file what nmax sep dec quote skip nlines na strin
  • R源代码.调用函数[重复]

    这个问题在这里已经有答案了 我正在查看R中cov的source code 并遇到了一段我不太明白的代码 协方差的数学定义goes http en wikipedia org wiki Covariance here if method pe
  • 指定生存图的自定义时间点

    我正在努力使用以下方法创建生存 累积事件图ggsurvplot函数从survminer包裹 我想为我的绘图指定自定义时间点 但我不知道该怎么做 这xlim and break x by参数有点帮助 但它们创建了均匀间隔的时间点和比我想要的更
  • R testthat 单元测试数据和辅助函数约定

    我正在编写一个 R 包 并使用 testthat 进行单元测试 我的许多单元测试都是为了测试适用于我的包特定对象的功能 对于这些测试 我创建了一个辅助函数来设置模拟对象 我还有一些其他辅助函数来减少单元测试中的代码量 目前这些辅助函数在我的
  • R:install.packages 中出现错误:无法打开连接

    我试图安装 RINDSEL 包 但无法安装它 并且不断收到以下错误 install packages 中出错 无法打开连接 我从以下位置下载了该软件包 rindsel 1 0 2 zip 综合养殖平台 http old ibpdev net
  • 为“facet_wrap”中的每列创建边框和标题

    我想在每个方面周围放置带有标签和标题的黑色边框facet wrap 与此类似的东西 样本数据 library tidyverse mtcars gt mutate gear factor gear levels c 4 3 5 gt ggp
  • 替换向量中非 %in% 向量的值

    简短的问题 我可以像这样替换某些变量值 values lt c a b a b c a b df lt data frame values 将 df values 的所有值替换为 x 其中值是neither a 或 b 输出应该是 c a
  • ggplot2 中的小时刻度

    我正在处理就寝时间和醒来时间 因此我想创建一个具有 24 小时 x 轴的图表 从第一天中午 12 点开始 到第二天中午 12 点结束 这意味着晚上 11 59 之后 它应该再次从 0 开始 同样的问题 仅涉及数字 我想创建一个从 10 到
  • 合并具有一个共同元素的集合 R

    我有一个这样的列表 lista list lista 1 c 1 2 4 6 8 9 10 11 12 19 32 34 35 36 37 38 lista 2 c 7 8 lista 3 c 13 14 16 26 27 28 29 30
  • r caret 包中的 train 函数的模型输出尺寸巨大

    我正在使用 bagFDA 模型进行训练train r caret 包中的函数 并将模型输出保存为 Rdata 文件 输入文件大约有 300k 条记录 有 26 个变量 但输出 Rdata 大小为 3G 我只是运行以下命令 modelout
  • 读取并绘制从大文件中读取的数据

    我们有相当大的文件 大约为 1 1 5 GB 主要是日志文件 其中包含易于解析为 csv 的原始数据 随后应该将其绘制成图表以生成一组图形图像 目前 我们正在使用 bash 脚本将原始数据转换为 csv 文件 其中仅包含需要绘制图表的数字
  • 如何管理和处理 R 包中的补充数据

    我想在我的 R 包中添加补充数据 我知道关于LazyData true in DESCRIPTION 但不想使用它 因为示例数据相当大 所以我创建了一个目录 data 其中包含两个 RData文件和一个datalist 我添加使用tools
  • R dplyr过滤多列上的字符串条件

    我有一个 df 例如 df lt read table text v1 v2 v3 v4 v5 1 A B X C 2 A B C X 3 A C C C 4 B D V A 5 B Z Z D header T 如果变量 v2 到 v5
  • Rstudio 命令历史记录

    这些天我经常使用 Rstudio 但最近注意到我的命令不再存储在历史记录中 我不知道这是从什么时候开始的 但可能是在安装最新版本时发生的 关于问题可能是什么的任何想法吗 Thanks 这是我们在 v0 93 73 中引入并在 v0 93 7
  • R:为什么 kable 不在 for 循环内打印?

    我正在使用 rmarkdown 和 Latex 编写报告 我需要使用打印一组表格knitr kable 但在 for 循环内时不会打印 这是我的代码 title project title author Mr Author date 201
  • S4 类 [(子集)带有附加参数的继承

    这是一个扩展在 R 中的访问器函数中使用 callNextMethod https stackoverflow com q 24875284 2752888 2017 03 25 更新 为了说明如何仅在加载方法时失败 但在构建的包中时不会失
  • 计算 R 中数据帧的每一行中特定值的连续出现次数

    我有一个data frame许多位置 这么多行 的变量的每月值 我想计算值为零的连续月份 即连续单元格 的数量 如果只是从左到右阅读 这很容易 但增加的复杂性是年底与年初是连续的 例如 在下面的缩短示例数据集中 用季节而不是月份 位置 1
  • 按列分组的数据帧上 R 中的行之间的差异

    我希望通过 app name 获得不同版本的计数差异 我的数据集如下所示 app name version id count difference 这是数据集 data structure list app name structure c

随机推荐

  • ViewPager 拦截所有 x 轴 onTouch 事件。如何禁用?

    Scope 有一个包含两个片段的viewpager 其中一个片段有一个布局 用于监听 X 轴上的 onTouch 变化 Problem 当沿 X 轴触摸和滑动时 布局几乎不会获取所有 Action Move 事件 看来 viewpager
  • 对shinyTable进行子集化

    我目前正在玩shinyTable这是一个shinyHandsonTable 的兼容实现 https github com trestletech shinyTable https github com trestletech shinyTa
  • 有选择地中止通过 Extjs Direct 代理发送的 ajax 请求

    我有一个商店 它使用 Extjs 直接代理从列表中加载 w r t 项目 proxy type direct api read bomManagementAction bomQuickDetails 响应显示在网格面板中 如果选择的项目数量
  • 在 Chrome 中打印背景颜色

    我正在尝试在 Chrome 中打印 PHP 生成的文档 在浏览器上看起来不错链接到我要打印的页面 http www abbeysoft co uk adi 241 quote php但是我的打印机无法打印任何彩色背景 有人可以提供任何建议吗
  • 哪些用例需要 #define 而不使用令牌字符串?

    我遇到过 define预处理器指令之前在学习C时 然后在我读过的一些代码中也遇到过它 但除了使用它来明确替换常量和定义宏之外 我还没有真正理解它在没有 主体 或标记字符串的情况下使用的特殊情况 以这一行为例 define OCSTR X 就
  • ffmpeg创建RTP流

    我正在尝试使用 ffmpeg 进行编码和流式传输 libavcodec libavformat MSVC x64 with Zeranoe builds 这是我的代码 很大程度上改编自编码示例 删除了错误处理 include stdafx
  • GCM 条款和条件

    有谁知道在哪里可以找到有关哪些内容可以通过 GCM 通知发送以及哪些内容不可以发送的条款和条件 我似乎在任何地方都找不到任何文档 当您注册开设 Google API 帐户时 您会得到这些条款和条件 https developers goog
  • 包java.time不存在,jdk1.8

    嗯 我刚刚开始从事代号工作 我对 Java 有相当不错的经验 我的代码一切都很好 没有任何问题 但在编译时我得到了这个 error package java time does not exit import java time Local
  • 如何在同一个项目中连接两个数据库MySQL和MongoDB?是否可以?

    目前我正在使用 Hibernate MySQL 和 Spring 配置对我来说运行良好 但是一旦我配置了另一个配置 mongo config xml 文件并尝试使用 mongodb 运行测试用例 它就显示创建名为 的 bean 时出错从第一
  • EPERM:不允许操作,mkdir 'C:\Program Files\nodejs\node_modules\.staging

    我正在尝试在我的项目上运行 npm install 但它显示 EPERM 不允许操作 mkdir C Program Files nodejs node modules staging 我没有 root 管理访问权限 我在我的系统中以本地用
  • ? LIKE(列 || '%')

    我可以有这样的条件吗 SELECT FROM table WHERE LIKE column 哪里的 是一个字符串参数值 例如 这些参数值 当列等于时应返回 true admin products admin products 1 admi
  • Boto3 - 打印 AWS 实例平均 CPU 利用率

    我正在尝试仅打印 AWS 实例的平均 CPU 利用率 此代码将打印出 响应 但最后的 for 循环不会打印平均利用率 有人可以帮忙吗 先感谢您 import boto3 import sys from datetime import dat
  • 如何设置报表服务器实例?

    我正在尝试设置 Microsoft SQL Server Reporting Services 我打开 Reporting Services 配置管理器 它要求输入服务器名称 问题是 我不知道服务器名称 因为据我所知还没有设置报表服务器 那
  • 以编程方式创建进度绘制

    我有一个场景 我需要有大量的进度条可绘制对象 我无法为所有这些创建 xml 资源 因为我希望用户选择一种颜色 然后用于动态创建可绘制对象 下面是 xml 中的一个这样的可绘制对象 我如何以编程方式创建这个精确的可绘制对象
  • Mongoose 更新或插入许多文档

    我正在尝试使用最新版本的 mongoose 插入对象数组 或者更新相应的产品 ID 是否已存在 我一生都无法找出正确的使用方法 bulkWrite updateMany 等 而且我似乎无法在不出现错误的情况下找出语法 例如 我正在尝试 Pr
  • 在等式约束的情况下求解线性规划

    我问了一个问题 可以在这里找到 计算最优组合 https stackoverflow com questions 17232596 computing the optimal combination 并有人建议线性规划 我查阅了线性规划和单
  • 从以元组为键的字典中获取 pandas 数据框

    我是Python新手 并且已经在这个问题上挣扎了一段时间 我有一个这样的字典 dict1 a a 5 a b 10 a c 11 b a 4 b b 8 b c 3 我想做的是将其转换为 pandas 数据框 如下所示 a b c a 5
  • 无法在 Eclipselink 上合并日期

    我的会话 bean 不会对托管实体执行更新 我已经包含了相关类的代码 当我使用 prime faces 计划组件修改事件的日期字段并将修改后的实体传递给会话 bean 并调用 em merge event 时 实体管理器不会尝试更新实体 并
  • 使用文本框搜索 datagridview 中的列 (vb.net)

    如何使用文本框搜索 datagridview 中的列 我正在使用 vb net 2010 我有一个带有数据源的 Datagridview 下面是我用于填充 datagridview 的代码 网格视图将有 4 列 Private Sub Lo
  • 将 ddply + mutate 与自定义函数一起使用?

    I use ddply相当频繁 但历史上有summarize 偶尔mutate 并且只有基本功能 例如mean var1 var2等等 我有一个数据集 我试图在其中应用一个自定义的 更复杂的函数 并开始尝试深入研究如何做到这一点ddply