繁体   English   中英

ř骨料的多个行

[英]R Aggregate multiple rows

我的问题似乎是一个非常普遍的问题,但是我在互联网上找到的解决方案不起作用...

我想在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个值的总和)绝对不正确! 我不明白为什么...

你有想法吗 ?

非常感谢你 !

乔尔

可能是因为未使用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))

你也可以做加法使用rowsum(),虽然它(也许误导)给出了输出的0总和,而不是为NA细胞只有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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM