R语言dataframe指定列空值填充:用前一列有效值填充而非整行填充
R逐行向前填充空值解决方案
问题原因
你原有代码无法生效的核心原因有两个:
- 你的数据中空值是空字符串
"",而非NA,is.na()判断条件永远不触发 - R会自动将数字开头的日期列名转换为带
X前缀的合法列名,若未提前排序会导致填充顺序错误
解法1:修改原有循环逻辑
# 步骤1:将空字符串替换为NA df[df == ""] <- NA # 步骤2:逐列向前填充 for (i in 2:ncol(df)) { df[,i] <- dplyr::coalesce(df[,i], df[,i-1]) } # 步骤3:按需将NA转回空字符串 df[is.na(df)] <- ""
解法2:tidyverse简洁写法(无需手动写循环)
library(tidyverse) library(zoo) df1 <- df %>% # 将空字符串转为NA mutate(across(-Resource_Code, ~ifelse(. == "", NA, as.numeric(.)))) %>% # 按行执行向前填充 rowwise() %>% mutate(across(-Resource_Code, ~na.locf(.x, na.rm = FALSE))) %>% ungroup() %>% # 将剩余NA转回空字符串 mutate(across(-Resource_Code, ~ifelse(is.na(.x), "", .x)))
注意事项
填充前务必确认所有日期列是按时间升序从左到右排列,若列顺序混乱可先执行排序代码:
# 提取日期列并按时间排序 date_cols <- names(df)[-1] # 转换日期格式时注意匹配实际列名的格式,若列名已经是`2021-09-01`格式则去掉format参数的X和. sorted_dates <- sort(as.Date(date_cols, format = "X%Y.%m.%d")) df <- df[, c("Resource_Code", as.character(sorted_dates))]
内容的提问来源于stack exchange,提问作者ks ramana
相关产品推荐
相关产品推荐

