我有一个带有三列的数据框架。这些列上有许多丢失的值。我想创建一个新的唯一ID列,该列为每一行提供相同的ID,在三个列之一中具有至少一个相同的值。
数据框看起来像
df=data.frame(id1=c(5,5,NA,NA,NA,5,4,NA,NA),
id2=c(NA,58,58,58,NA,58,NA,66,66),
id3=c(NA,NA,NA,581,581,581,NA,669,NA))
df
id1 id2 id3
1 5 NA NA
2 5 58 NA
3 NA 58 NA
4 NA 58 581
5 NA NA 581
6 5 58 581
7 4 NA NA
8 NA 66 669
9 NA 66 NA
新列应该看起来像
df=data.frame(id1=c(5,5,NA,NA,NA,5,4,NA,NA),
id2=c(NA,58,58,58,NA,58,NA,66,66),
id3=c(NA,NA,NA,581,581,581,NA,669,NA),
ID=c(1,1,1,1,1,1,2,3,3))
id1 id2 id3 ID
1 5 NA NA 1
2 5 58 NA 1
3 NA 58 NA 1
4 NA 58 581 1
5 NA NA 581 1
6 5 58 581 1
7 4 NA NA 2
8 NA 66 669 3
9 NA 66 NA 3
给定您对@gregor的问题的回答,这是一个有点可概括的解决方案:
ID1.criteria <- c(5,58,581)
ID2.criteria <- c(4)
ID3.criteria <- c(66,669)
ID <- NULL
for (i in 1:nrow(df)) {
if (any(df[i,] %in% ID1.criteria)) {
ID[i] <- 1
} else {
if (any(df[i,] %in% ID2.criteria)) {
ID[i] <- 2
} else {
if (any(df[i,] %in% ID3.criteria)) {
ID[i] <- 3
} else {
ID[i] <- NA
}
}
}
}
df$ID <- ID
df
id1 id2 id3 ID
1 5 NA NA 1
2 5 58 NA 1
3 NA 58 NA 1
4 NA 58 581 1
5 NA NA 581 1
6 5 58 581 1
7 4 NA NA 2
8 NA 66 669 3
9 NA 66 NA 3
如果需要出现在同一行中。