R函数粘贴来自不同列的信息?

R function to paste information from different columns?

我有一个包含 3 个不同标识的数据框,有时它们会重叠。我想按优先顺序(id1>id2>id3)创建一个新列,其中只有一个 id。 例如:

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), (ifelse(df$id1)))

我可以在 Excel 上执行此操作,但我正在切换到 R,因为它更可靠且可重现:) 但在 excel 中我会使用:

=if(A1="",B1,(if(B1="",C1,B1)),A1)

使用 dplyr 包中的 coalesce,我们可以尝试:

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))

base 中,您可以使用 is.na(df)apply 和函数 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