2017-06-01 44 views
0

我想在一個循環中執行不同的聚合被應用到我的數據的不同行子集,但它似乎棘手的實現(如果可能的話):我可以使用從數據框中獲取的參數進行聚合嗎?

t <- data.frame(agg=c(list("field1"=field1, "field2"=field2), ...), 
       fun=c(mean, ...)) 
f <- function(x) { 
    for (i in 1:nrow(t) { 
     y <- aggregate(x, by=t$agg[i], FUN=t$fun[i]) 
     # do something with y 
    } 
} 

一個問題是,該場列表agg嘗試構建數據幀時觸發錯誤(「object'field1'not found」),另一個問題是R不喜歡將函數值分配給fun(「不能強制類」功能「」到data.frame「)。

附錄: 我的數據(只是爲了符合上述定義),一個具體的例子是:

> d <- data.frame(field1=round(rnorm(5, 10, 1)),field2=letters[round(rnorm(5, 10, 1))], field3=1:5) 
> d 
    field1 field2 field3 
1  11  j  1 
2  11  i  2 
3  10  j  3 
4  12  i  4 
5  11  j  5 
> with(d, aggregate(d$field3,by=list(field1, field2),FUN=mean)) 
    Group.1 Group.2 x 
1  11  i 2 
2  12  i 4 
3  10  j 3 
4  11  j 3 

搞小動作在數據幀中的變量名,我還是得到這樣的:

> with(d,t <- data.frame(agg=c(list("field1"=field1, "field2"=field2)),fun=c(mean))) 
Error in as.data.frame.default(x[[i]], optional = TRUE) : 
    cannot coerce class ""function"" to a data.frame 
+0

'by'參數應該有一個與'x'長度相同的向量。這個條件是否滿足?你能提供一個可重複的例子嗎? –

+0

爲什麼你會用這個數據框來代替列表? – LAP

+0

@Leo P:是_「你爲什麼要用這個數據框而不是列表?」_表示你有一個列表解決方案? –

回答

0

的問題是幾個,大多是由R製作例外一般加工造成的:

  • 首先一個向量不能嵌套,但只能列表。仍然所有的元素都需要具有相同的類型。
  • 其次,data.frame在構造變量時造成了一些神奇的處理(導致無法分配閉包),所以無法使用它。
  • 最後我不得不名稱引用變量來聚集

所以定義如下所示(其中, ...的意思是「增加更多的類似項目」):

t <- list(agg=list(c("field1", "field2"), ...), 
      fun=list(mean, ...)) 

f <- function(x) { 
    for (i in 1:length(t$agg)) { 
     agg <- t$agg[[i]] 
     aggList <- lapply(agg, FUN=function(e) x[[e]]) 
     names(aggList) <- agg 
     y <- aggregate(x, by=aggList, FUN=t$fun[[i]]) 
     # do something with y 
    } 
} 

注:在實際解決方案我添加了另一個列表,其中包含要爲彙總數據框選擇的列名稱,以避免有關mean返回NA的警告。

相關問題