一个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且仅第一个元素将被用来
答
在孟臣等人的帮助下,我得到了一个直截了当的答案。
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
感谢您的直接解决方案。但对于更广泛的应用,似乎参数方法更合适。 –
撇开:我不确定这是否是您获取数据的方式,但是在单个产品列中连接这些Apple&htc等并不是一个好主意。要创建具有相同ID的另一行更好,那么所有这些聚合和操作都更容易。 –