2014-01-10 58 views
0

我的數據如下:一個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的另一行更好,那麼所有這些聚合和操作都更容易。 –

回答

0

在孟臣等人的幫助下,我得到了一個直截了當的答案。

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

也許這不是最好的答案,但它確實有效。

0

的直接解決問題的方法可能是:

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

感謝您的直接解決方案。但對於更廣泛的應用,似乎參數方法更合適。 –