如何用marks1列值填充marks2列的NA值?代码执行报错求解
问题原因与解决方法
报错原因
你遇到的警告是因为:
df$marks2[is.na(df$marks2)]是长度为3的向量(数据里有3个NA值)- 而你用来替换的
df$marks1是长度为4的向量
R会尝试循环填充替换值,但因为4不是3的整数倍,所以抛出警告,且替换结果也不符合你想要的「对应行marks1值填充marks2的NA」的需求。
解决代码
基础R方法
直接对marks1做子集筛选,只取marks2为NA的对应行值:
df = data.frame(id=c(25,40,30,30), name=c('Chris','Scott','Anna','Ramana'), gender=c('m','m','f','m'), marks1=c(99,30,50,40), marks2=c(80,NA,NA,NA)) df$marks2[is.na(df$marks2)] <- df$marks1[is.na(df$marks2)]
dplyr简洁方法
用coalesce函数直接取非NA值(优先用marks2,NA则用marks1):
library(dplyr) df = data.frame(id=c(25,40,30,30), name=c('Chris','Scott','Anna','Ramana'), gender=c('m','m','f','m'), marks1=c(99,30,50,40), marks2=c(80,NA,NA,NA)) df <- df %>% mutate(marks2 = coalesce(marks2, marks1))
最终结果
处理后marks2列的值会变为 c(80, 30, 50, 40),完全符合用对应行marks1插补marks2的NA的需求。
内容的提问来源于stack exchange,提问作者four77
相关产品推荐
相关产品推荐

