2015-06-20 62 views
0

我正在尝试使用ddply来处理3列data.frame中的2列。我知道我以前做过这件事,但对于我的生活,我无法获得任何工作。这里的例子:R-ddply在3列数据中的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 
+0

你的func只有一个参数,你在'ddply'中使用了两个参数。这是为什么? – user227710

+0

对不起,修正了......我在玩一堆东西。编辑函数的问题虽然如此。 – jdesilvio

+0

您是否需要“按组”进行此操作?如果没有,那么没有理由使用'ddply'。另外,这是你真正的功能,还是一个简单的例子?因为如果这是你真正的功能,我们可以在它上面做很多工作...... – Gregor

回答

0
ddply(df,.(name), summarize, result=ifelse(a>b,a-b,0)) 

OR

func = function(x, y) { ifelse(x>y,x-y,0)} 
ddply(df,.(name), summarize, result=func(a,b)) 

运行在Rfiddle

0

代码的ddply点是分裂申请-结合,即分裂开一些分组变量的数据帧,做一些于各样片,和把它放回去。您没有分组变量,因此使用plyr::ddply没有意义。 (你可以像@ user227710'回答显示的那样,但它不是真的正在做任何它的目的,比如让你的车开过一条街道。)对于你的问题的例子,代码应该是

# vectorized function 
myfunc = function(x, y) ifelse(x > y, x -y, 0) 

df$result = with(df, myfunc(a, b)) 
# then drop unused columns, if you want 

较新的dplyr包是可以做的plyr全部的分割申请-结合的东西,但也意在清理代码一般,一起打破任务分成小块,让您在“链”起来。

library(dplyr) 
mutate(df, result = myfunc(a, b)) %>% 
    select(name, a, b, result)