【问题标题】:R - ddply to act on 2 columns in 3 column data.frameR - ddply 作用于 3 列 data.frame 中的 2 列
【发布时间】: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


【解决方案1】:
ddply(df,.(name), summarize, result=ifelse(a>b,a-b,0))

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

运行Rfiddle中的代码

【讨论】:

    【解决方案2】:

    ddply 的要点是 split-apply-combine,即通过一些分组变量拆分数据框,对每个部分做一些事情,然后将其重新组合在一起。您没有分组变量,因此使用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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-04
      • 1970-01-01
      • 2015-04-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-28
      相关资源
      最近更新 更多