如何在R语言中根据no_change列值将对应及后续月份列设为NA?
解决R语言宽格式数据框按指定月份置NA的问题
问题背景
现有宽格式数据框df,列代表2010年各月份,记录每月颜色变化。需将每行中列名等于或晚于no_change列指定月份的对应值设为NA,no_change为NA的行保持原样。
解决方案
方法1:使用tidyverse工具
先加载依赖包:
library(tidyverse)
处理葡语月份缩写(Ago→Aug,Dez→Dec),转换为R可识别的日期格式:
# 定义月份缩写替换规则 month_map <- c("Ago" = "Aug", "Dez" = "Dec") # 转换月份列名为日期 month_cols_dates <- colnames(df)[3:ncol(df)] %>% str_replace_all(month_map) %>% as.Date(format = "%b.%Y") # 转换no_change列为日期 df <- df %>% mutate(no_change_date = str_replace_all(no_change, month_map) %>% as.Date(format = "%b.%Y"))
逐行匹配并置NA:
for (i in 1:nrow(df)) { if (!is.na(df$no_change_date[i])) { # 定位需要置NA的列索引 target_cols <- which(month_cols_dates >= df$no_change_date[i]) + 2 df[i, target_cols] <- NA } } # 移除临时辅助列 df <- df %>% select(-no_change_date)
方法2:Base R原生实现
无需额外包,用Base R完成:
# 替换葡语月份缩写 month_cols <- colnames(df)[-c(1,2)] month_dates <- as.Date( gsub("Ago", "Aug", gsub("Dez", "Dec", month_cols)), format = "%b.%Y" ) # 转换no_change列为日期 no_change_dates <- as.Date( gsub("Ago", "Aug", gsub("Dez", "Dec", df$no_change)), format = "%b.%Y" ) # 逐行处理 for (i in seq_len(nrow(df))) { if (!is.na(no_change_dates[i])) { target_cols <- which(month_dates >= no_change_dates[i]) + 2 df[i, target_cols] <- NA } }
验证结果
运行代码后查看df,即可得到目标输出:
df # id no_change Jan.2010 Feb.2010 Mar.2010 Apr.2010 May.2010 Jun.2010 Jul.2010 Ago.2010 Sep.2010 Oct.2010 Nov.2010 Dez.2010 # 1 123 May.2010 green green green green NA NA NA NA NA NA NA NA # 2 124 <NA> black black red red red red white white white white white white # 3 125 <NA> pink pink pink pink pink pink pink pink pink pink pink grey # 4 126 Sep.2010 grey grey grey grey grey grey grey grey NA NA NA NA
内容的提问来源于stack exchange,提问作者Nao
相关产品推荐
相关产品推荐

