为何R计算dataframe得分时报“替换项数不是替换长度倍数”错误
问题原因分析
警告触发原因
你代码里的赋值语句左右两侧长度不匹配:
- 赋值左侧
dat$score[!is.na(dat[,num])]是仅选中当前第num列非空的行,长度等于当前列非空值的行数,一定小于等于整个dat的总行数 - 赋值右侧
dat$score + dat[,num]是全表所有行的计算结果,长度等于dat的总行数
当两者长度不是整数倍关系时,R会强行循环截断右侧内容匹配左侧长度,就会抛出你看到的长度不匹配警告,赋值的位置也会出现错乱。
部分行返回NA的原因
+运算符遇到NA时会直接返回NA,哪怕你只打算给非空行赋值,右侧计算的时候,所有第num列为空的行对应的计算结果已经变成了NA,再加上前面说的赋值位置错乱,这些NA就会被错误写入score列的不同位置,最终只有刚好赋值没出错的行能得到正确结果。
最优解决方案
完全不需要写循环,直接用R内置的rowSums函数即可一行实现需求,na.rm = TRUE参数会自动跳过NA值仅计算非空值的和:
dat$score <- rowSums(dat[, 69:88], na.rm = TRUE)
如果确实需要用循环实现来验证逻辑,修改后的循环写法如下:
dat$score <- 0 for (num in 69:88) { # 仅对当前列非空的行,取这些行的score加对应列的值赋值回去 non_na_idx <- !is.na(dat[, num]) dat$score[non_na_idx] <- dat$score[non_na_idx] + dat[non_na_idx, num] }
内容的提问来源于stack exchange,提问作者gliu18
相关产品推荐
相关产品推荐

