R语言:含NA值的变量求和与分类变量创建问题
R语言数据处理问题
原始数据
a <- c(1,2,3,NA,5,NA) b <- c(5,NA,4,NA,NA,6) # 注:原代码将ab定义为向量,无法用$访问列,需修正为数据框 ab <- data.frame(a, b)
问题1:创建变量c,实现「数值+NA=数值」的求和规则
需求
生成变量c,仅当a和b同时为NA时结果为NA,其余情况遵循数值+NA=数值的求和规则,期望输出:
ab$c <- c(6,2,7,NA,5,6)
错误尝试
使用ab$c <- a+b得到结果6 NA 7 NA NA NA,无法正确应用na.rm=TRUE。
解决方案
使用rowSums函数结合NA判断,既实现忽略单个NA求和,又保留全NA的情况:
# 先忽略NA按行求和 ab$c <- rowSums(ab[, c("a", "b")], na.rm = TRUE) # 将a和b同时为NA的行重新设为NA ab$c[rowSums(is.na(ab[, c("a", "b")])) == 2] <- NA
运行后ab$c结果为[1] 6 2 7 NA 5 6,符合需求。
问题2:创建分类变量d,规则为「值<=4则设为1,否则为0」
需求
生成变量d:只要a或b有一个值<=4则设为1;两个值都>4则设为0;仅当a和b同时为NA时结果为NA,期望输出:
ab$d <- c(1,1,1,NA,0,0)
错误尝试
使用ab$d = ifelse(ab$a<=4|ab$b<=4,1,0)得到logical(0),原因是原代码将ab定义为向量,不存在ab$a这类列名。
解决方案
基于数据框格式,结合ifelse和NA判断逻辑实现:
# 先标记a和b同时为NA的行 is_all_na <- is.na(ab$a) & is.na(ab$b) # 生成分类变量d ab$d <- ifelse(is_all_na, NA, ifelse(ab$a <=4 | ab$b <=4, 1, 0))
运行后ab$d结果为[1] 1 1 1 NA 0 0,符合需求。
内容的提问来源于stack exchange,提问作者nnet
相关产品推荐
相关产品推荐

