r - 如何根据另一列的 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)
解决方案
如果您只能从两列中选择,这里有一些选项。
在基础 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_cols
usinggrep
和 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")
推荐阅读
- java - 从项目父 pom 构建时激活位于不同 pom 中的配置文件
- angular - Angular 6:在子路由中跳过父路由解析器?
- javascript - Angular 不会返回内部嵌套的 for 循环
- python - 循环函数查找数字的平方根
- openstack - Openstack Neutron:通过rest api为路由器添加静态路由器
- spring - 如何使用 spring 存储库进行 bean 验证?
- cpanel - 当我遇到一些电子邮件问题时如何配置 WHM 服务器
- php - 电子邮件进入收件箱,但显示垃圾邮件
- mysql - MySQL:检查一列是否具有基于另一列的值
- html-table - Gmail 在我的 HTML 签名的第一行之后的行上添加 STRANGE 填充