用temp数据框随机值填充metadata的NA值后数据未更新问题
问题原因与解决方法
核心问题:循环范围错误
原代码里的for (i in length(metadata$Gender))只会让i取到最后一行的索引,根本不会遍历所有行。只有最后一行的NA会被检查(如果存在的话),其他行的NA完全没处理,所以metadata看起来没变化。
修正后的循环代码
把循环范围改成遍历所有行的索引,比如用seq_len(nrow(metadata))(比1:nrow(metadata)更安全,避免空数据框报错):
temp = metadata %>% drop_na() # 遍历所有行的索引 for (i in seq_len(nrow(metadata))){ if (is.na(metadata$Gender[i])) { metadata$Gender[i] = sample(temp$Gender, 1) } if (is.na(metadata$Age[i])){ metadata$Age[i] = sample(temp$Age, 1) } }
注:向量索引用[i]和[[i]]效果一致,这里写法更简洁。
更高效的tidyverse替代方案
如果习惯用dplyr风格,不用循环也能实现,代码更简洁高效:
library(dplyr) temp = metadata %>% drop_na() metadata = metadata %>% mutate( Gender = ifelse(is.na(Gender), sample(temp$Gender, n(), replace = TRUE), Gender), Age = ifelse(is.na(Age), sample(temp$Age, n(), replace = TRUE), Age) )
这里sample(..., n(), replace = TRUE)会生成和metadata行数匹配的随机样本,再用ifelse把NA替换成对应随机值,非NA值保留原样。
内容的提问来源于stack exchange,提问作者Programming Noob
相关产品推荐
相关产品推荐

