2016-09-28 63 views
0

考慮這種情況,我想要在summarize_each中使用混合列類型的data.frame。如何總結每列混合列類

> (temp=data.frame(ID=c(1,1,2,2),gender=c("M","M","F","F"),val1=rnorm(4),val2=rnorm(4))) 
    ID gender  val1  val2 
1 1  M -1.7944804 0.5232313 
2 1  M 0.3938437 -0.8424086 
3 2  F -0.3190777 0.3220580 
4 2  F 1.3667340 -0.6031376 

> temp%>%group_by(ID)%>%summarize_each(funs(mean)) 
Source: local data frame [2 x 4] 

    ID gender  val1  val2 
    (dbl) (lgl)  (dbl)  (dbl) 
1  1  NA -0.7003184 -0.1595886 
2  2  NA 0.5238282 -0.1405398 

這不起作用,因爲mean(gender)沒有意義。

問題: 如果我所有的非數字列的ID特點,因此,每個ID內是相同的,可不知何故,我得到summarize_each回到那「獨一無二」的價值?

> temp%>%group_by(ID,gender)%>%summarize_each(funs(mean)) 
Source: local data frame [2 x 4] 
Groups: ID [?] 

    ID gender  val1  val2 
    (dbl) (fctr)  (dbl)  (dbl) 
1  1  M -0.7003184 -0.1595886 
2  2  F 0.5238282 -0.1405398 

是我想要的輸出,但我有點喜歡這種感覺是做不必要的嵌套group_by因爲實在是沒什麼好組內ID

+0

'TEMP%>%GROUP_BY(ID)%>%summarize_each(玩意兒(平均值),VAL1:val2的)'或另一種選擇是'TEMP%>%GROUP_BY(ID)%>%summarise_if(是。數字,平均數)' – akrun

+0

@akrun我更新了問題以使其更清晰。我確實希望返回具有唯一值的性別列。 – qoheleth

+0

您可以在'summarise_each'中傳遞多個函數,但是它會爲所有列執行此操作。你真的需要dplyr還是可以有其他解決方案?我認爲用'dplyr',可能不能用'summarise_each' – akrun

回答

1

tidyr可以得到一個選項gather/spread。重塑爲'長'格式,由'ID','var'分組gather,得到'gender'的first元素和'val'的meanspread返回'寬'格式。

library(tidyr) 
library(dplyr) 
gather(temp, var, val, val1:val2) %>% 
     group_by(ID, var) %>% 
     summarise(gender = first(gender), val = mean(val)) %>% 
     spread(var, val) 

或者其他使用mutate_ifunique。經過'ID'分組後,我們得到numeric列的mean,其中mutate_if。由於其他列(即'性別'也保留在輸出中),我們只需執行unique即可從輸出中獲取unique行。

temp %>% 
    group_by(ID) %>% 
    mutate_if(is.numeric, mean) %>% 
    unique() 
# ID gender  val1  val2 
# <int> <chr>  <dbl>  <dbl> 
#1  1  M -0.7003184 -0.1595886 
#2  2  F 0.5238281 -0.1405398