如何基于另一列的NA值添加新列?

时间:2019-09-01 07:09:52

标签: r join dplyr

我需要基于具有NA值的列和其他列的值的某些条件在R中创建一个新列。

例如,我尝试了以下代码:

expr1 <- data.frame(from =c("S01", "S02"),to1= c("S02", "S03"),tel=c(123,456))

expr2 <- data.frame(from =c("S01", "S04"),to2= c("S02", "S05"),post=c('ABC','XYZ'))



exp <- full_join(expr1, expr2,by="from") 

exp

现在我想创建一个新列,该列可以为值提供一个新列:

类似于名为“ to”的列,其值为S02 S03 S05。所以“ to”类似于

ifelse(is.na(exp$to1)== TRUE,exp$to=exp$to2 , exp$to=exp$to1)

1 个答案:

答案 0 :(得分:1)

如果您只需要从两列中进行选择,则可以选择以下选项。

在基数R中,您可以使用ifelse

exp$to <- with(exp, ifelse(is.na(to1), to2, to1))

#  from  to1 tel  to2 post  to
#1  S01  S02 123  S02  ABC S02
#2  S02  S03 456 <NA> <NA> S03
#3  S04 <NA>  NA  S05  XYZ S05

使用dplyr,您可以使用case_when

library(dplyr)
exp %>%
  mutate(to = case_when(is.na(to1)~to2, 
                        TRUE ~to1))

coalesce

exp %>% mutate(to = coalesce(to1, to2))

但是,如果您有多个"to"列可供选择,并且不想分别写每个条件,我们可以使用to_cols和{ {1}}获取每一行的第一个非NA值。

grep

数据

如果您在max.col创作中添加to_cols <- grep("^to", names(exp)) exp$to <- exp[to_cols][cbind(seq_len(nrow(exp)), max.col(!is.na(exp[to_cols]), ties.method = "first"))] ,生活将会简单得多

stringsAsFactors = FALSE