2014-10-29 80 views
3

當我需要將多個函數按順序應用於多列並按多列進行聚合並希望將結果綁定到數據框中時,我通常使用aggregate()方式如下:將多個函數應用於數據框中的每列使用聚合

# bogus functions 
foo1 <- function(x){mean(x)*var(x)} 
foo2 <- function(x){mean(x)/var(x)} 

# for illustration purposes only 
npk$block <- as.numeric(npk$block) 

subdf <- aggregate(npk[,c("yield", "block")], 
        by = list(N = npk$N, P = npk$P), 
        FUN = function(x){c(col1 = foo1(x), col2 = foo2(x))}) 

具有一個很好的有序數據幀的結果是通過使用實現:

df <- do.call(data.frame, subdf) 

能否避免請撥打do.call()通過某種方式使用aggregate()更聰明在這種情況下或縮短整個過程從另一個基地R解決方案從一開始?

+0

請注意,在'subdf'我也會有一個數據框。但它將是一個數據框,其中包含我想要避免的某些列中的矩陣! – 2014-10-29 07:15:23

+1

這個任務使用'data.table'非常簡單(這是爲什麼這個包很受歡迎的幾個原因之一)。我不認爲你可以比你展示的方式更容易地在基本R中達到你想要的結果。 – nicola 2014-10-29 07:17:14

+2

@ lord.garbage我猜你不需要'cbind','do.call(data.frame,subdf)'就足夠了。另一個選擇是使用'dplyr'中的'summarise_each'。 – akrun 2014-10-29 07:20:03

回答

2

正如@akrun所示,dplyrsummarise_each非常適合這項任務。

library(dplyr) 
npk %>% 
    group_by(N, P) %>% 
    summarise_each(funs(foo1, foo2), yield, block) 

# Source: local data frame [4 x 6] 
# Groups: N 
# 
# N P yield_foo2 block_foo2 yield_foo1 block_foo1 
# 1 0 0 2.432390   1 1099.583  12.25 
# 2 0 1 1.245831   1 2205.361  12.25 
# 3 1 0 1.399998   1 2504.727  12.25 
# 4 1 1 2.172399   1 1451.309  12.25 
+1

由於問題是否有一個更簡單的基礎'R'解決方案似乎是「不」,我會接受你的答案。 – 2014-10-29 10:09:44

相關問題