聚合数据帧中的多行

时间:2017-07-26 08:43:32

标签: r

我有一个如下所示的数据框:

id=c(3, 3, 4, 5, 5)
a_2015 =c("abc", NA, NA, "abc", NA)
a_2016 = c("NA", "def", "abc", NA, "abc")
df = data.frame(id, a_2015, a_2016)

df

     id    a_2015    a_2016
1    3     abc       NA   
2    3     NA        def
3    4     NA        abc       
4    5     abc       NA
5    5     NA        abc

这意味着如果列a_2015是一个条目而不是a_2016中的NA,或者反之亦然。因此,在a_2015和a_2016两列中,您永远不能在同一行中包含有效条目。

我想聚合数据框,如

id    a_2015    a_2016
3     abc       def
4     NA        abc
5     abc       abc

我试图用聚合来解决它,但现在我觉得我需要像申请这样的东西,或者?我很感谢任何提示!

2 个答案:

答案 0 :(得分:0)

我们可以使用

library(data.table)
setDT(df)[, lapply(.SD, function(x) x[!is.na(x)]), id][]
setDT(df)[, lapply(.SD, function(x) x[!is.na(x)]), id][]
#   id a_2015 a_2016
#1:  3    abc    def
#2:  4     NA    abc
#3:  5    abc    abc

数据

id=c(3, 3, 4, 5, 5)
a_2015 =c("abc", NA, NA, "abc", NA)
a_2016 = c(NA, "def", "abc", NA, "abc")
df = data.frame(id, a_2015, a_2016)

答案 1 :(得分:0)

您也可以使用dplyr

library(tidyverse)
df %>% 
  group_by(id) %>% 
  summarise(tmp=paste(a_2015, a_2016, collapse = "")) %>% 
  mutate(tmp=gsub("NANA ", "", tmp)) %>% 
  separate(tmp, into = c("a_2015", "a_2016"), sep = " ")
# A tibble: 3 x 3
     id a_2015 a_2016
* <dbl>  <chr>  <chr>
1     3    abc    def
2     4     NA    abc
3     5    abc    abc

甚至基地R:

aggregate(df[,-1],  list(df$id), function(x) gsub("NA", "", paste0(x, collapse = "")))
  Group.1 a_2015 a_2016
1       3    abc    def
2       4           abc
3       5    abc    abc

然后,您必须将""替换为NA并编辑同名。