一个R函数包含plyr - ddply():在ddply参数()不能正确地过去

问题描述:

我的数据如下:一个R函数包含plyr - ddply():在ddply参数()不能正确地过去

>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&nokia等我需要的是,所以我将apple and htc自己改为参数,像这样的新的可能的功能:

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

查看区别? 我已将'apple','htc'更改为a,b(参数) 但它根本不是我想要的。

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

错误的eval(expr中,ENVIR,enclos):参数丢失,没有默认值此外:警告消息: 在grep的(paste0(一个,b)中,产品 “*”。 ): 参数“图案”具有长度> 1且仅第一个元素将被用来

+2

撇开:我不确定这是否是您获取数据的方式,但是在单个产品列中连接这些Apple&htc等并不是一个好主意。要创建具有相同ID的另一行更好,那么所有这些聚合和操作都更容易。 –

在孟臣等人的帮助下,我得到了一个直截了当的答案。

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) 
} 

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

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

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")) 
) 
+0

感谢您的直接解决方案。但对于更广泛的应用,似乎参数方法更合适。 –