首页 > 解决方案 > 如何根据另一列的 NA 值添加新列?

问题描述

我需要根据具有 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 的新列,它可以为我提供一个新列的值:

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

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

标签: rjoindplyr

解决方案


如果您只能从两列中选择,这里有一些选项。

在基础 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"列可供选择并且不想为每个列单独编写 if else 条件,我们可以选择to_colsusinggrep和 usingmax.col获取每行的第一个非 NA 值。

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如果你加入你的data.frame创作,生活会简单得多

expr1 <- data.frame(from =c("S01", "S02"),to1= c("S02", "S03"),
                    tel=c(123,456), stringsAsFactors = FALSE)
expr2 <- data.frame(from =c("S01", "S04"),to2= c("S02", "S05"),
                    post=c('ABC','XYZ'), stringsAsFactors = FALSE)
exp <- full_join(expr1, expr2,by="from") 

推荐阅读