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
我有一个包含 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