考虑一下这种情况,我想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 :(得分: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
mean
列numeric
和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