按列分组并折叠所有不包含NA的其他列

时间:2018-11-16 16:01:21

标签: r group-by na

我有一个数据框,我正在尝试通过称为“ id”的组列折叠一堆列, 但是我得到了很多NA值。有没有办法删除NA或仅在粘贴函数中使用唯一值?

df<- data.frame(id=c(1, 1, 2, 3, 3, 3),
                bar=c('a', 'b', 'a', 'b', 'c', 'NA'),
                foo=c('NA', 'b', 'a', 'b', 'NA', 'NA'))

library(plyr)
df %>%
  group_by(id) %>%
  summarise_all(funs(unique(paste(., collapse = ",")))) 

我想删除“ NA” ... 另外,此函数比基本聚合花费的时间更长,但是我也没有找到聚合函数的正确公式:

aggregate(df, by=list(df$id), paste, collapse=",")

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以添加ifelse():

df %>%
  group_by(id) %>%
  summarise_all(funs(unique(paste(ifelse(is.na(.), "", .), collapse = ",")))) 

答案 1 :(得分:1)

首先将文字“ NA”值转换为真实NA较为安全:

library(dplyr)

df %>%
  mutate_all(~replace(., .=='NA', NA)) %>%
  group_by(id) %>%
  summarize_all(~paste(unique(na.omit(.)), collapse = ','))

输出:

# A tibble: 3 x 3
     id bar   foo  
  <dbl> <chr> <chr>
1     1 a,b   b    
2     2 a     a    
3     3 b,c   b