【问题标题】:R function contain plyr--ddply(): parameters in ddply() cannot be past correctlyR函数包含plyr--ddply():ddply()中的参数不能正确过去
【发布时间】:2014-01-29 05:53:13
【问题描述】:

我的数据如下:

>df2
   id     calmonth       product
1 101       01           apple
2 102       01           apple&nokia&htc
3 103       01           htc
4 104       01           apple&htc
5 104       02           nokia

para=c('apple','htc','nokia')

我想获取产品中包含apple&htc,apple&nokia 等的 id 数量。 我做了一个函数如下:

xandy=function(a,b){
        ddply(df2,.(calmonth),summarise,
                              csum=length(grep(paste0('apple','.*','htc'),product)),
                              coproduct=paste0('apple','&','htc')
             )
                   }

这个函数给我一个完美的结果如下:

> xandy(para[1],para[3])
  calmonth csum   coproduct
1       01    2   apple&htc
2       02    0   apple&htc

但我需要的不仅仅是apple&htc,而是apple&nokiaetc,所以我将apple and htcthemself 更改为参数,新的可能函数如下:

xandy=function(a,b){
        ddply(df2,.(calmonth),summarise,
                              csum=length(grep(paste0(a,'.*',b),product)),
                              coproduct=paste0(a,'&',b)
             )
                   }

看到差异了吗? 我已将 'apple' ,'htc' 更改为 a,b(parameters) 但这根本不是我想要的。

> xandy(para[1],para[3])

eval(expr, envir, enclos) 中的错误:缺少参数,没有默认值另外:警告消息: 在 grep(paste0(a, ".*", b), product) : 参数 'pattern' 的长度 > 1,并且只使用第一个元素

【问题讨论】:

  • 顺便说一句:我不确定这是否是您获取数据的方式,但是在单个产品列中将 apple&htc 等串联起来是个坏主意。最好只创建具有相同 ID 的另一行,然后所有这些聚合和操作要容易得多。

标签: regex r parameter-passing plyr


【解决方案1】:

您的问题的直接解决方案可能是:

ddply(df2, .(calmonth), summarise, 
               apple = as.numeric(length(product == "apple")),
               apple.nokia.htc = as.numeric(length(product == "apple&nokia&htc")),
               htc = as.numeric(length(product == "htc")),
               apple.htc = as.numeric(length(product == "apple&htc"))
)

【讨论】:

  • 感谢您的直截了当的解决方案。但是对于更多扩展的应用程序,参数方法似乎更合适。
【解决方案2】:

在梦辰等人的帮助下,我得到了直截了当的答案。

xandy=function(a,b){
myStr_match=paste0(a,'.*',b)
myStr_match1=paste0(b,'.*',a)
ajoinb_match=paste0(a,'&',b)
ddply(df2,.(calmonth),function(data,myStr,myStr1,ajoinb){
summarise(data,
          csum=max(length(grep(myStr,product)),length(grep(myStr1,product))),
          coproduct=ajoinb)
  },myStr=myStr_match,myStr1=myStr_match1,ajoinb=ajoinb_match)
}

也许这不是最好的答案,但无论如何它确实有效。

【讨论】:

    猜你喜欢
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    相关资源
    最近更新 更多