2017-08-13 31 views
2

像的問題後,我要分配這些都是由lapply和tapply在R.一個簡單的例子進行處理的列名:分配的列名行的名稱使用lapply

df<-data.frame('X1'=rnorm(100), 
       'X2'=rnorm(100), 
       'X3'=c(c(rep('A',50)),c(rep('B',50)))) 


var<-c('X1','X2') 
plyr::ldply(lapply(var, function(v) { 
    tapply(df[,v],df$X3,mean) 
}),rbind) 

,這將導致爲:

  A   B 
1 -0.06856352 0.08608197 
2 -0.23585510 0.01551267 

從中我無法判斷第1行是來自'X1'還是'X2'。我要的是:

  A   B 
X1 -0.06856352 0.08608197 
X2 -0.23585510 0.01551267 

雖然我們可以做在這個例子中一個簡單的手工檢查和一個大膽的猜測,第1行是從「X1」,然而,這會時,有很多更多的變量變得繁瑣和危險的,功能比平均值複雜得多。

任何人都知道如何做到這一點?您的時間和知識將深受讚賞。提前致謝。

+1

爲什麼不'骨料(。〜X3,DF,平均)'或'噸(合計(。〜X3,DF,平均) ,-1])'? – Sotos

+1

或'group_by(df,X3)%>%summarise_each(funs(mean))' – coffeinjunky

+0

感謝Sotos和coffeinjunky,這兩個評論讓我更接近我想要的解決方案。彙總,group_by,summarise_each函數爲我提供了處理這類問題的新工具,我太過沉迷於應用函數。 –

回答

1

我們也可以使用summarise_atcolumn_to_rownames

library(tidyverse) 
df %>% 
    group_by(X3) %>% 
    summarise_at(vars(var), mean) %>% 
    as.data.frame() %>% 
    column_to_rownames("X3") %>% 
    t 
#   A   B 
#X1 -0.1720188 0.1834966 
#X2 0.1413389 0.1138864 
+1

感謝您的回覆@akrun,您的代碼看起來非常整潔優雅,完美地解決了我的問題。我會以此作爲答案。 –

1

只是爲了充實我的意見:很多人喜歡用dplyr做拆分應用組合操作。見例如如下:

library(dplyr) 

set.seed(1) 
df<-data.frame('X1'=rnorm(100), 
       'X2'=rnorm(100), 
       'X3'=c(c(rep('A',50)),c(rep('B',50)))) 

var<-c('X1','X2') 

out <- df %>% group_by(X3) %>% select_(.dots = var) %>% summarise_each(funs(mean)) 
out 

# A tibble: 2 × 3 
     X3  X1   X2 
    <fctr>  <dbl>  <dbl> 
1  A 0.1004483 -0.15248544 
2  B 0.1173265 0.07686929 

如果您想要應用更多的功能或應用更復雜的功能,它的工作方式是相同的。例如,應用兩個功能:

df %>% group_by(X3) %>% select_(.dots = var) %>% summarise_each(funs(mean, sd)) 

# A tibble: 2 × 5 
     X3 X1_mean  X2_mean  X1_sd  X2_sd 
    <fctr>  <dbl>  <dbl>  <dbl>  <dbl> 
1  A 0.1004483 -0.15248544 0.8313939 0.8997394 
2  B 0.1173265 0.07686929 0.9688279 1.0086725 

如果您確實希望這樣做,您可以輕鬆調換結果。

transposed <- t(out[,-1]) 
colnames(transposed) <- t(out[,1]) 
transposed 
      A   B 
X1 0.1004483 0.11732645 
X2 -0.1524854 0.07686929 
+0

感謝您的回覆@ coffeinjunky,您的代碼完美解決了我的問題,詳細的插圖也非常有幫助,特別是您提到的多個功能。不幸的是,上面的akrun的回答也是有效的,他提前一點提供了,因此我以他的答案作爲答案。雖然我想讓它成爲一個答案,但我會標記爲有用,但是,您知道,stackoverflow不會允許我這樣做。 –