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