R中的聚合命令

R中的聚合命令,r,aggregate,R,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 谢谢。您可以试试: library(tidyr); df$name <- as.factor(df$name) aggregate(ID ~ name, unique(df[co

如何使用聚合命令转换此表:

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  
谢谢。

您可以试试:

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
library(tidyr);
df$name%
完成(姓名)
来源:本地数据帧[3 x 2]
姓名ID
(fctr)(chr)
1 a 1 | 2
2b不适用
3c-NA
这里的逻辑是首先过滤掉所有不完整的行和重复的行,将ID粘贴在一起,然后使用
tidyr
包中的
complete
功能自动用所有级别填充因子变量,以确保不丢失任何信息。

您可以尝试:

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
library(tidyr);
df$name%
完成(姓名)
来源:本地数据帧[3 x 2]
姓名ID
(fctr)(chr)
1 a 1 | 2
2b不适用
3c-NA
这里的逻辑是首先过滤掉所有不完整的行和重复的行,将ID粘贴在一起,然后使用
tidyr
包中的
complete
功能自动用所有级别填充因子变量,以确保不丢失任何信息。

> 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
在处理第四行时,这与您的规范不同。

在base中:

> 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

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

我们可以使用
data.table
。将'data.frame'转换为'data.table'(
setDT(df1)
),按'name'分组,
如果'ID'中的元素是
all
NA,则返回NA或
else
粘贴
在'ID'列中不为NA的
唯一的
元素

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>
库(dplyr)
df1%>%
分组单位(名称)%>%
总结(ID=if(all(is.na(ID)))na_字符
else粘贴(唯一(ID[!is.na(ID)]),折叠=“|”)
#姓名ID
#   
#1 a 1 | 2
#2 b
#3 c

我们可以使用
数据表。将'data.frame'转换为'data.table'(
setDT(df1)
),按'name'分组,
如果'ID'中的元素是
all
NA,则返回NA或
else
粘贴
在'ID'列中不为NA的
唯一的
元素

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>
库(dplyr)
df1%>%
分组单位(名称)%>%
总结(ID=if(all(is.na(ID)))na_字符
else粘贴(唯一(ID[!is.na(ID)]),折叠=“|”)
#姓名ID
#   
#1 a 1 | 2
#2 b
#3 c