如何在R中仅当两列均为非NA值时拼接字符串?
R语言实现拼接列并处理NA的解决方案
针对你遇到的问题,这里提供几种简洁的实现方式,解决paste函数把NA转为字符串的问题:
先构造示例数据框
方便你直接测试代码:
df1 <- data.frame( Genus = c("Canis", "Felis", "Panthera"), Species = c("lupus", NA, "pardus"), stringsAsFactors = FALSE )
方法1:基础R原生实现
用ifelse先判断Species是否为NA,再决定返回NA还是拼接结果:
df1$Genusspecie <- ifelse(is.na(df1$Species), NA, paste(df1$Genus, df1$Species))
原理:通过条件判断过滤NA场景,避免paste把NA转为字符串"NA"。
方法2:dplyr+stringr tidyverse风格实现
适合习惯tidyverse语法的用户,if_else比基础R的ifelse类型更严谨,str_c处理字符串更灵活:
library(dplyr) library(stringr) df1 <- df1 %>% mutate(Genusspecie = if_else(is.na(Species), NA_character_, str_c(Genus, Species, sep = " ")))
方法3:stringr极简实现
利用str_c的特性:只要输入中有NA,结果就返回NA(刚好匹配你的需求,因为只有Species可能为NA):
library(stringr) df1$Genusspecie <- str_c(df1$Genus, df1$Species, sep = " ")
这个方法最简洁,无需额外条件判断,直接满足规则:Species为NA时Genusspecie为NA,否则拼接两列。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

