R汇总多行

时间:2018-08-01 15:48:43

标签: r row aggregate

我的问题似乎是一个非常普遍的问题,但是我在互联网上找到的解决方案却无效...

我想在R中的数据框中聚合行。 这是我的数据框(df)的结构,它是引用表:

Autors      Lannoy_2016  Ramadier_2014  Lord_2009  Ortar_2008
Burgess E             1             NA         NA          NA
Burgess E             1             NA         NA          NA
Burgess E             1             NA         NA          NA
Burgess E             1             NA         NA          NA
Kaufmann V           NA              1         NA          NA
Kaufmann V           NA             NA          1          NA
Kaufmann V           NA             NA         NA           1
Orfeuil P             1             NA         NA          NA
Orfeuil P            NA              1         NA          NA
Sorokin P            NA             NA         NA           1

那就是我想要的:

Autors      Lannoy_2016  Ramadier_2014  Lord_2009  Ortar_2008
Burgess E             4             NA         NA          NA
Kaufmann V           NA              1          1           1
Orfeuil P             1              1         NA          NA
Sorokin P            NA             NA         NA           1

我已经尝试过这些解决方案,但是不起作用:

ddply(df,"Autors", numcolwise(sum))

df %>% group_by(Autors) %>% summarize_all(sum)

它很好地汇总了行,但是值(1个值的总和)绝对不正确!而且我不明白为什么...

你有个主意吗?

非常感谢您!

乔尔

2 个答案:

答案 0 :(得分:0)

可能是因为未使用na.rm

library(dplyr)
df %>%
   group_by(Autors) %>% 
   summarize_all(sum, na.rm = TRUE)

如果同时加载了plyrdplyr,则summarise会被屏蔽,但对summarise_all却是一个dplyr函数还是有疑问

基于预期的输出,使用na.rm = TRUE,它将删除所有NA,如果在某些情况下只有NA,则返回0。为避免这种情况,我们可以使用条件

df %>% 
   group_by(Autors) %>% 
   summarize_all(funs(if(all(is.na(.))) NA else sum(., na.rm = TRUE)))
# A tibble: 4 x 5
#  Autors     Lannoy_2016 Ramadier_2014 Lord_2009 Ortar_2008
#  <chr>            <int>         <int>     <int>      <int>
#1 Burgess E            4            NA        NA         NA
#2 Kaufmann V          NA             1         1          1
#3 Orfeuil P            1             1        NA         NA
#4 Sorokin P           NA            NA        NA          1

数据

df <- structure(list(Autors = c("Burgess E", "Burgess E", "Burgess E", 
"Burgess E", "Kaufmann V", "Kaufmann V", "Kaufmann V", "Orfeuil P", 
"Orfeuil P", "Sorokin P"), Lannoy_2016 = c(1L, 1L, 1L, 1L, NA, 
 NA, NA, 1L, NA, NA), Ramadier_2014 = c(NA, NA, NA, NA, 1L, NA, 
 NA, NA, 1L, NA), Lord_2009 = c(NA, NA, NA, NA, NA, 1L, NA, NA, 
 NA, NA), Ortar_2008 = c(NA, NA, NA, NA, NA, NA, 1L, NA, NA, 1L
 )), .Names = c("Autors", "Lannoy_2016", "Ramadier_2014", "Lord_2009", 
 "Ortar_2008"), class = "data.frame", row.names = c(NA, -10L))

答案 1 :(得分:0)

您也可以使用 rowsum()进行求和,尽管(可能会引起误解)对于输出中仅具有输入NA的单元,其总和为0而不是NA。

 rowsum(df[,c(2:5)],df$Autors,na.rm=T)

礼物:

            Lannoy_2016 Ramadier_2014 Lord_2009 Ortar_2008
 Burgess E            4             0         0          0
 Kaufmann V           0             1         1          1
 Orfeuil P            1             1         0          0
 Sorokin P            0             0         0          1