- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常使用ddply
,但从历史上讲,它是summarize
(有时是mutate
),只有基本功能(例如mean()
,var1 - var2
等)。我在一个数据集中尝试应用自定义,参与程度更高的功能,并开始尝试研究如何用ddply
做到这一点。我有一个成功的解决方案,但是我不明白为什么它会像这样,而对于更多的“正常”功能却如此。
相关的
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
根据
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
然后仅调出我关心的列吗?
mutate
和
summarize
的含义感到困惑...认为它们是
ddply
的参数,涉及如何处理结果与实际上是函数本身。因此,感谢您的深刻见解。
mutate/summarize
,我需要返回
data.frame
,这就是我必须对返回的
cbind
中的列名进行
df
的原因。
mutate
,那么现在可以返回向量结果并获得正确的结果将非常有帮助。因此,我可以做到这一点,在阅读您的回答后,我现在已经明白了:
# 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))
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
id
变量重复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_mean
的mini df返回
df
,其中
mean
是
value
向量(返回一个值)取平均值的结果。因此,我的输出只是一个包含三个值的
data.frame
,每个
id
组一个。我在想
mutate
方式“记住”它已传递一个小型数据帧,然后重复单个输出以匹配其长度?
df_ply_5
的评论;的确,如果我删除
rep()
位并仅返回
mean(x)
,那么效果很好!
最佳答案
你基本上是对的。 ddply
确实根据石斑鱼将您的数据分解为微型数据帧,并对每个片段都应用了一个函数。
使用ddply
,所有工作都通过数据帧完成,因此.fun
参数必须以一个(小型)数据帧作为输入,并返回一个数据帧作为输出。mutate
和summarize
是适合此要求的函数(它们获取和返回数据帧)。您可以查看他们的个人帮助页面,也可以在ddply
之外的数据框中运行它们,例如
mutate(mtcars, mean.mpg = mean(mpg))
summarize(mtcars, mean.mpg = mean(mpg))
mutate
或
summarize
,也就是说,您
仅使用自定义函数,那么您的函数还需要采用一个(小型)数据帧作为参数,并返回一个数据帧。
mutate
或summarize
做,则传递给
ddply
的任何其他函数都不会被
ddply
使用,它们只会传递给
mutate
或
summarize
使用。
mutate
和
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
或
summarize
,则必须给其他函数提供参数;您不只是传递函数。
ddply
一个已经“知道”平均值的函数。为此,我认为您不需要使用
mutate
或
summarize
,但是您可以破解自己的版本。对于类似
summarize
的行为,返回带有单个值的data.frame,对于类似于
mutate
的行为,返回原始data.frame,并在其上加上额外的值
cbind
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)
Why can't I use mutate with a custom function? Is it just that "built-in" functions return some sort of class that ddply can deal with vs. having to kick out a full data.frame and then call out only the column I care about?
mutate
和
summarize
将数据帧作为输入,并踢出数据帧作为返回。但是mutt和总结
就是您要传递给ddply的函数,而不是指其他任何东西。
ddply
的99%的时间中使用它们。
mean
这样的函数;您传递一个表达式,例如
mean(mpg)
。
dplyr
呢?
dplyr
还是一件大事之前写的。
dplyr
消除了此过程中的许多困惑,因为它实际上将
ddply
的嵌套替换为
mutate
或
summarize
作为带有顺序函数
group_by
后跟
mutate
或
summarize
的参数的嵌套。我的答案的
dplyr
版本是
library(dplyr)
group_by(mtcars, cyl) %>%
mutate(mean.mpg = mean(mpg))
mutate
(或
summarize
)后,对于哪个函数执行什么操作就不会感到困惑。
关于r - 使用具有自定义功能的ddply + mutate吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935150/
我正在构建一个 RCP 应用程序,其中每个季度都会更新功能/插件。因此,如果用户选择自动更新功能/插件,则会下载更新插件的新 jar,但旧插件仍在使用我不再使用的磁盘空间。 我厌倦了删除包含旧 jar
我如何从外部 Controller 功能中调用 Controller 内部的功能,例如电话间隙回调功能 这是 Controller 外部定义的功能 function onDeviceReady()
如果某个功能(例如 MediaSource)可用,我如何使用 Google Dart 检查。 new MediaSource() 抛出一个错误。如何以编程方式检查此类或功能是否存在?有任何想法吗?是否
我正在尝试运行 Azure Orchestrations,突然我开始从 statusQueryGetUri 收到错误: 协调器函数“UploadDocumentOrchestrator”失败:函数“U
我见过 iPhone 上的应用程序,如果在 3.0 上运行,将使用 3.0 功能/API,例如应用内电子邮件编辑器,如果在 2.x 上运行,则不使用这些功能,并退出应用程序以启动邮件相反。 这是怎么做
这是 DB 规范化理论中的一个概念: Third normal form is violated when a non-key field is a fact about another non-ke
如果我定义 #if SOMETHING #endif 而且我还没有在任何地方定义 SOMETHING。 #if 中的代码会编译吗? 最佳答案 当#if的参数表达式中使用的名称未定义为宏时(在所有其他宏
我刚刚澄清了 A* 路径查找应该如何在两条路径具有相等值的 [情况] 下运行,无论是在计算期间还是在结束时,如果有两条相等的短路径。 例如,我在我的起始节点,我可以扩展到两个可能的节点,但它们都具有相
Java有没有类似下面的东西 宏 一种遍历所有私有(private)字段的方法 类似于 smalltalk symbols 的东西——即用于快速比较静态字符串的东西? 请注意,我正在尝试为 black
这个程序应该将华氏度转换为摄氏度: #include int main() { float fahrenheit, celsius; int max, min, step;
当打开PC缓存功能后, 软件将采用先进先出的原则排队对示波器采集的每一帧数据, 进行帧缓存。 当发现屏幕中有感兴趣的波形掠过时, 鼠标点击软件的(暂停)按钮, 可以选择回看某一帧的波形
我有一个特殊的(虚拟)函数,我想在沙盒环境中使用它: disable.system.call eval(parse(text = 'model.frame("1 ~ 1")'), envir = e
使用新的 Service 实现,我是否必须为我的所有服务提供一个 Options 方法? 使用我的所有服务当前使用的旧 ServiceBase 方法,OPTIONS 返回 OK,但没有 Access-
我正在阅读 Fogus 的关于 Clojure 的喜悦的书,在并行编程章节中,我看到了一个函数定义,它肯定想说明一些重要的事情,但我不知道是什么。此外,我看不到这个函数有什么用 - 当我执行时,它什么
我有大量的 C 代码,大部分代码被注释掉和/或 #if 0。当我使用 % 键匹配 if-else 的左括号和右括号时,它也匹配注释掉的代码。 有没有办法或vim插件在匹配括号时不考虑注释掉或#if 0
我有这个功能: map(map(fn x =>[x])) [[],[1],[2,3,4]]; 产生: val it = [[],[[1]],[[2],[3],[4]]] 我不明白这个功能是如何工作的。
我使用 Visual Studio 代码创建了一个函数应用程序,然后发布了它。功能应用程序运行良好。我现在在功能门户中使用代码部署功能(KUDU)并跳过构建。下面是日志 9:55:46 AM
我有一个数据框df: userID Score Task_Alpha Task_Beta Task_Charlie Task_Delta 3108 -8.00 Easy Easy
我真的无法解决这个问题: 我有一个返回数据框的函数。但是,数据框仅打印在我的控制台中,尽管我希望将其存储在工作空间中。我怎样才能做到这一点? 样本数据: n <- 32640 t <- seq(3*p
有没有办法找出所有可能的激活器命令行选项? activator -help仅提供最低限度的可用选项/功能列表,但所有好的东西都隐藏起来,即使在 typesafe 网站在线文档中也不可用。 到目前为止,
我是一名优秀的程序员,十分优秀!