如何使用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
感谢。
答案 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>