2016-09-28 61 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