我需要基于具有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)
答案 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