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

问题描述 投票:0回答:1

我有一个数据框架,有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)

r new-operator paste id which
1个回答
2
投票

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

0
投票

In 基础 你可以用 applyis.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
© www.soinside.com 2019 - 2024. All rights reserved.