R中的聚合命令

时间:2016-06-10 17:02:43

标签: r aggregate

如何使用aggregate命令转换此表:

name  ID   
a     1   
a     2 
a     2
a     NA   
b     NA   
c     NA
c     NA   

到这一个:

name  ID   
a     1|2    
b     NA   
c     NA  

感谢。

3 个答案:

答案 0 :(得分:4)

在基地:

> aggregate(ID ~ name, data=x, FUN=function(y) paste(unique(y), 
                                      collapse='|'),na.action=na.pass)
  name     ID
1    a 1|2|NA
2    b     NA
3    c     NA

这与您在处理第四行时的规范不同。

答案 1 :(得分:3)

您可以尝试:

library(tidyr);
df$name <- as.factor(df$name)

aggregate(ID ~ name, unique(df[complete.cases(df),]), paste, collapse = "|") %>% 
   complete(name)

Source: local data frame [3 x 2]

    name    ID
  (fctr) (chr)
1      a   1|2
2      b    NA
3      c    NA

这里的逻辑是首先过滤掉所有不完整的行和重复的行,将ID粘贴在一起,然后使用complete包中的tidyr函数自动填充因子变量以及所有要生成的级别确定没有遗漏任何信息。

答案 2 :(得分:3)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(df1)),按'name'分组,if'ID'中的元素为all NA,然后我们返回NA或else paste“ID”列中不是NA的unique元素。

library(data.table)
setDT(df1)[,.(ID= if(all(is.na(ID))) NA_character_ else 
           paste(na.omit(unique(ID)), collapse = "|")), by = name]
#   name  ID
#1:    a 1|2
#2:    b  NA
#3:    c  NA

可以在dplyr

中使用相同的方法
library(dplyr)
df1 %>%
   group_by(name) %>% 
   summarise(ID = if(all(is.na(ID))) NA_character_ 
                   else paste(unique(ID[!is.na(ID)]), collapse="|"))
#   name    ID
#  <chr> <chr>
#1     a   1|2
#2     b  <NA>
#3     c  <NA>