我的问题似乎是一个非常普遍的问题,但是我在互联网上找到的解决方案却无效...
我想在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个值的总和)绝对不正确!而且我不明白为什么...
你有个主意吗?
非常感谢您!
乔尔
答案 0 :(得分:0)
可能是因为未使用na.rm
library(dplyr)
df %>%
group_by(Autors) %>%
summarize_all(sum, na.rm = TRUE)
如果同时加载了plyr
和dplyr
,则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