根据几个条件填充列,并优先考虑这些条件

时间:2019-06-11 20:33:21

标签: r dplyr

我有一个这样的数据集:

Age <- rnorm(n=100, mean=20, sd=5)
ind <- which(Age %in% sample(Age, 50))
Age[ind]<-NA

Age2 <- rnorm(n=100, mean=20, sd=5)
ing <- which(Age2 %in% sample(Age2, 50))
Age2[ing]<-NA

Age3 <- rnorm(n=100, mean=20, sd=5)
int <- which(Age3 %in% sample(Age3, 50))
Age3[int]<-NA


data<-data.frame(Age,Age2,Age3)

它是一个旧的数据集,几个不同的人放在一起,其中多列表示同一件事(实际数据集中有几列表示年龄)。如您所见,有很多NA。我想创建一个统一的“年龄”列。为此,我想理想地使用第一年龄列中的数字,但是如果是NA,则优先使用Age2中的数字,如果也是NA,我将使用Age3,而我d希望以此顺序执行操作(Age3永远不会取代Age2等),因为我相信按此顺序输入数据的人会哈哈。

我知道这里还有其他答案,可以根据几种条件填充列,例如:dplyr replacing na values in a column based on multiple conditions 但是我不确定如何确定优先级。谢谢!

2 个答案:

答案 0 :(得分:3)

您可以使用coalesce()中的dplyr,它将根据从左到右的第一个非缺失值进行填充。

library(dplyr)

df <-data.frame(Age,Age2,Age3)
df$new_age <- coalesce(!!!df)

head(df)

       Age     Age2     Age3  new_age
1 17.19762       NA       NA 17.19762
2 18.84911 21.17693       NA 18.84911
3 27.79354       NA       NA 27.79354
4       NA 15.19072       NA 15.19072
5       NA       NA 27.99254 27.99254
6 28.57532       NA 19.55717 28.57532

答案 1 :(得分:1)

base R的可能性可能是:

apply(data, 1, function(x) x[which(!is.na(x))[1]])