2015-08-20 35 views
1

我一直在試圖概括一個函數,我用不同的鍵做了許多不同的聚合,然後將它們合併在一起。 首先一個例子data.table:r data.table函數由多個變量聚合

DT <- data.table(
        Key1=c("giallo","giallo","giallo","verde","verde","verde","verde","verde"), 
        Key2=c("M","M","L","S","M","M","M","L"), 
        Filtro=c(1,1,1,0,0,0,1,1), 
        Var1=c(1,4,5,3,7,5,8,1), 
        Var2=c(11,24,15,33,17,45,38,21) 
       ) 

隨着question的幫助下,我寫了下面的代碼:

Tavola <- function(s,chiave1,chiave2=NULL) 
{ 

    Tavola1 <- s[, 
       by=eval(chiave1), 
       list(
        Somma11=sum(Var1), 
        Somma12=sum(Var2), 
        Media11=mean(Var1), 
        Media12=mean(Var2) 
        ) 
       ] 
    print(Tavola1) 
    Tavola2 <- s[Filtro==1, 
       by=eval(chiave1), 
       list(
         Somma21=sum(Var1), 
         Somma22=sum(Var2), 
         Media21=mean(Var1), 
         Media22=mean(Var2) 
        ) 
       ] 
    print(Tavola2) 
    Tavola3 <- s[Filtro==1 & Var1>3, 
       by=eval(chiave1), 
       list(
         Somma32=sum(Var2), 
         Media32=mean(Var2) 
        ) 
       ] 

    print(Tavola3) 
    mymerge = function(x,y) merge(x,y,by=chiave1,all=TRUE) 
    TavolaFinale <- Reduce(mymerge,list(Tavola1,Tavola2,Tavola3)) 

    return(TavolaFinale) 
} 
TavolaStat <- Tavola(s=DT,chiave1="Key1") 
> TavolaStat 
    Key1 Somma11 Somma12 Media11 Media12 Somma21 Somma22 Media21 Media22 Somma32 Media32 
1: giallo  10  50 3.333333 16.66667  10  50 3.333333 16.66667  39 19.5 
2: verde  24  154 4.800000 30.80000  9  59 4.500000 29.50000  38 38.0 

其中的作品,但是當我嘗試推廣到實際上是由2個可變鍵彙總我不能:

Tavola <- function(s,chiave1,chiave2=NULL) 
    { 

     Tavola1 <- s[, 
        by=list(eval((chiave1)),eval(chiave2)), 
        list(
         Somma11=sum(Var1), 
         Somma12=sum(Var2), 
         Media11=mean(Var1), 
         Media12=mean(Var2) 
         ) 
        ] 
     print(Tavola1) 
     Tavola2 <- s[Filtro==1, 
        by=list(eval(chiave1),eval(chiave2)), 
        list(
          Somma21=sum(Var1), 
          Somma22=sum(Var2), 
          Media21=mean(Var1), 
          Media22=mean(Var2) 
         ) 
        ] 
     print(Tavola2) 
     Tavola3 <- s[Filtro==1 & Var1>3, 
        by=list(eval(chiave1),eval(chiave2)), 
        list(
          Somma32=sum(Var2), 
          Media32=mean(Var2) 
         ) 
        ] 

     print(Tavola3) 
     mymerge = function(x,y) merge(x,y,by=c(chiave1,chiave2),all=TRUE) 
     TavolaFinale <- Reduce(mymerge,list(Tavola1,Tavola2,Tavola3)) 

     return(TavolaFinale) 
    } 
> TavolaStat <- Tavola(s=DT,chiave1="Key1") 
Show Traceback 

Rerun with Debug 
Error in `[.data.table`(s, , by = list(eval((chiave1)), eval(chiave2)), : 
    column or expression 2 of 'by' or 'keyby' is type NULL. Do not quote column names. Usage: DT[,sum(colC),by=list(colA,month(colB))] > 
> TavolaStat <- Tavola(s=DT,chiave1="Key1",chiave2="Key2") 
Show Traceback 

Rerun with Debug 
Error in `[.data.table`(s, , by = list(eval((chiave1)), eval(chiave2)), : 
    The items in the 'by' or 'keyby' list are length (1,1). Each must be same length as rows in x or number of rows returned by i (8). 

我該如何解決這個問題? 在此先感謝

+1

感謝您的編輯。你不可以用'c(chiave1,chiave2)'而不是'list'和'eval'這個業務嗎?用'c()',當一個元素爲NULL時,它將從矢量中刪除。 – Frank

+0

@Frank:第一個函數將chiave1和chiave2作爲參數,但只有chiave1在函數體中使用。第二個函數試圖同時使用兩個 – user3645882

+1

@Frank,謝謝它的作品。我一直使用data.table中的list – user3645882

回答

1

如何將這些鍵作爲1向量而不是2傳遞?

Tavola <- function(s,chiaves) 
{ 

    Tavola1 <- s[, 
       list(
       Somma11=sum(Var1), 
       Somma12=sum(Var2), 
       Media11=mean(Var1), 
       Media12=mean(Var2)), 
       by=chiaves 
       ] 
    print(Tavola1) 
    Tavola2 <- s[Filtro==1, 
       list(
       Somma21=sum(Var1), 
       Somma22=sum(Var2), 
       Media21=mean(Var1), 
       Media22=mean(Var2)), 
       by=chiaves 
       ] 
    print(Tavola2) 
    Tavola3 <- s[Filtro==1 & Var1>3, 
       list(
       Somma32=sum(Var2), 
       Media32=mean(Var2)), 
       by=chiaves 
       ] 

    print(Tavola3) 
    mymerge = function(x,y) merge(x,y,by=(chiaves),all=TRUE) 
    TavolaFinale <- Reduce(mymerge,list(Tavola1,Tavola2,Tavola3)) 

    return(TavolaFinale) 
} 
TavolaStat <- Tavola(s=DT,c("Key1","Key2"))