我有一个数据框架,有3个不同的标识,有时它们会重叠。我想创建一个新的列,只用其中的一个标识,按照优先顺序(id1>id2>id3).前。
id1 id2 id3
12 145 8763
45 836 5766
13 768 9374
836 5766
12 145
9282
567
45 836 5766
我想有。
id1 id2 id3 id.new
12 145 8763 12
45 836 5766 45
13 768 9374 13
836 5766 836
9282 9282
567 567
我试过if else,which,grep函数... 但我不能让它工作。我试过的例子。df$id1 <- ifelse(df$id1 == "", paste(df$2), (ifelse(df$id1)))
ps. 我可以在Excel上做这个,但我正在改用R,因为它更可靠和可重复:) 但在Excel中,我将使用。=if(A1="",B1,(if(B1="",C1,B1)),A1)
使用 coalesce
来自 dplyr
包,我们可以试试。
library(dplyr)
df$id.new <- coalesce(df$id1, df$id2, df$id3)
df
id1 id2 id3 id.new
1 12 145 8763 12
2 45 836 5766 45
3 13 768 9374 13
4 NA 836 5766 836
5 12 145 NA 12
6 NA NA 9282 9282
7 NA 567 NA 567
8 45 836 5766 45
数据。
df <- data.frame(id1=c(12,45,13,NA,12,NA,NA,45),
id2=c(145,836,768,836,145,NA,567,836),
id3=c(8763,5766,9374,5766,NA,9282,NA,5766))
In 基础 你可以用 apply
的 is.na(df)
带功能 which.min
得到一个用于子集的矩阵。感谢 @tim-biegeleisen 提供的数据集。
df$id.new <- df[cbind(1:nrow(df), apply(is.na(df), 1, which.min))]
df
# id1 id2 id3 id.new
#1 12 145 8763 12
#2 45 836 5766 45
#3 13 768 9374 13
#4 NA 836 5766 836
#5 12 145 NA 12
#6 NA NA 9282 9282
#7 NA 567 NA 567
#8 45 836 5766 45