微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在dmapply(ddR包)中运行聚合函数

我想在 dmapply函数中运行 dmapply函数中的聚合函数.

期望的结果

期望的结果反映了通过基数聚合生成的简单输出

aggregate(
  x = mtcars$mpg,FUN = function(x) {
    mean(x,na.rm = TRUE)
  },by = list(trans = mtcars$am)
)

产生:

trans        x
1     0 17.14737
2     1 24.39231

尝试 – ddmapply

我想在使用ddmapply时获得相同的结果,如下所示:

# ddR
require(ddR)

# ddR object creation
distMtcars <- as.dframe(mtcars)

# Aggregate / ddmapply
dmapply(
  FUN = function(x,y) {
    aggregate(FUN = mean(x,na.rm = TRUE),x = x,by = list(trans = y))
  },distMtcars$mpg,y = distMtcars$am,output.type = "dframe",combine = "rbind"
)

代码失败:

Error in match.fun(FUN) : 'mean(x,na.rm = TRUE)' is not a
function,character or symbol Called from: match.fun(FUN)

更新

@Mike指出的修复错误消除了错误,但是不会产生所需的结果.代码

# Avoid namespace conflict with other packages
ddR::collect(
  dmapply(
    FUN = function(x,y) {
      aggregate(
        FUN = function(x) {
          mean(x,na.rm = TRUE)
        },by = list(trans = y)
      )
    },combine = "rbind"
  )
)

收益率:

[1] trans x    
<0 rows> (or 0-length row.names)

解决方法

如果你将聚合函数更改为与之前调用函数一致,它对我来说很好:FUN = function(x)mean(x,na.rm = T).它找不到mean(x,na.rm = T)的原因是因为它不是一个函数(它是一个函数调用),而是一个函数.

除非你将x = distMtcars $mpg更改为x = collect(distMtcars)$mpg,否则它会给你NA结果.同样的y.尽管如此,我认为这应该适合你:

res <-dmapply(
  FUN = function(x,y) {
    aggregate(FUN = function(x) mean(x,x = list(collect(distMtcars)$mpg),y = list(collect(distMtcars)$am),combine = "rbind"
)

然后你可以收集(res)来查看结果.

collect(res)
#  trans        x
#1     0 17.14737
#2     1 24.39231

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐