如何用混合列类汇总_each

时间:2016-09-28 06:13:21

标签: r dplyr

考虑一下这种情况,我想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中确实没有任何内容可以分组。

1 个答案:

答案 0 :(得分:1)

gather/spread中的一个选项是tidyr。使用gather重新定义为“长”格式,按“ID”,“var”分组,获取“性别”的first元素和“val”的mean,{{1}它回到'宽'格式。

spread

或另一个人正在使用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_if。按“ID”分组后,我们会获得unique meannumericmutate_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