我正在尝试使用ddply来创建一个函数.但是我不能上班.这是一个复制我得到的虚拟例子.这有什么可以做这个bug吗?
library(ggplot2)
data(diamonds)
foo <- function(data, fac1, fac2, bar) {
res <- ddply(data, .(fac1, fac2), mean(bar))
res
}
foo(diamonds, "color", "cut", "price")
Run Code Online (Sandbox Code Playgroud)
jor*_*ran 10
我不相信这是一个错误.ddply期望你没有真正提供的函数的名称mean(bar).你需要编写一个完整的函数来计算你想要的平均值:
foo <- function(data, fac1, fac2, bar) {
res <- ddply(data, c(fac1, fac2), function(x,ind){
mean(x[,ind]},bar)
res
}
Run Code Online (Sandbox Code Playgroud)
此外,您不应该将字符串传递给.(),因此我将其更改为c(),以便您可以直接将函数参数传递给ddply.
Nic*_*bbe 10
您的代码存在很多问题,但主要问题是:您将列名称作为字符串传递.
只需在函数内对参数进行"查找和替换"即可:
res <- ddply(diamonds, .("color", "cut"), mean("price"))
Run Code Online (Sandbox Code Playgroud)
如果你理解了它是如何ddply工作的(我有点怀疑这个,给出其余的代码),你会明白这不应该工作:忽略最后一部分(函数)中的错误,这应该是(注意缺乏引号:.()表示法只不过是plyr提供引号的方式:
res <- ddply(diamonds, .(color, cut), mean(price))
Run Code Online (Sandbox Code Playgroud)
幸运的是,ddply还支持将其第二个参数作为字符向量传递,即列的名称,因此(再次忽略最后一个参数的问题),这应该变为:
foo <- function(data, facs, bar) {
res <- ddply(data, facs, mean(bar))
res
}
foo(diamonds, c("color", "cut"), "price")
Run Code Online (Sandbox Code Playgroud)
最后:你传递给的函数ddply应该是一个函数,它将data.frame作为它的第一个参数,每次都会保存你传递给data.frame(菱形)的部分,以获取当前值color和cut.mean("price")或者mean(price)都不是.如果你坚持使用ddply,这就是你需要做的:
foo <- function(data, facs, bar) {
res <- ddply(data, facs, function(dfr, colnm){mean(dfr[,colnm])}, bar)
res
}
foo(diamonds, c("color", "cut"), "price")
Run Code Online (Sandbox Code Playgroud)