【发布时间】:2015-06-20 03:27:09
【问题描述】:
我正在尝试使用 ddply 对 3 列 data.frame 中的 2 列进行操作。我知道我以前做过这件事,但对于我的一生来说,我什么都做不了。示例如下:
func = function(x, y) {
if(x>y) {
x-y
} else {
0
}
}
df = data.frame(name=c('w','x','y','z'), a=c(1,2,3,4), b=c(4,3,2,1))
这是我尝试过的方法以及许多其他方法:
ddply(df, summarize, func(a, b))
ddply(df, mutate, func(df$a, df$b))
ddply(df, func)
最常见的错误是:
Error in UseMethod("as.quoted") :
no applicable method for 'as.quoted' applied to an object of class "function"
预期输出:
name a b result
1 w 1 4 0
2 x 2 3 0
3 y 3 2 1
4 z 4 1 3
【问题讨论】:
-
您的函数只有一个参数,而您在
ddply中使用了两个参数。这是为什么呢? -
抱歉,修正了...我在玩一堆东西。编辑后的函数也有同样的问题。
-
您需要“按组”执行此操作吗?如果不是,那么没有理由使用
ddply。另外,这是您的真正功能,还是只是一个简化的示例?因为如果这是你真正的功能,我们可以做很多工作...... -
你考虑过“升级”到
dplyr吗?library(dplyr); df %>% mutate(result=pmax(0, a-b))。pmax和你的函数一样,应该比ifelse快。 -
或使用
data.tablesetDT(df)[, result:= pmax(0, a-b)]
标签: r