R语言按站点将重复值替换为NA并保留首次值的问题求助
解决按行替换重复值为NA的问题
问题原因
你得到NULL是因为R的for循环默认不返回任何值,你把for循环赋值给data变量,自然会得到NULL。而且你的循环逻辑是直接修改原数据框df,不需要额外赋值给新变量。
解决方案
方法1:修正原有的for循环
直接循环修改df,不要把for循环赋值给变量:
df <- data.frame(stringsAsFactors = FALSE, check.names = FALSE, Site = c("Att-Bissen","Alz-Ettelbruck","Our-Gemund/Vianden", "Syre Felsmuhle/Mertert","Ernz Blanche-Larochette"), `2001-12-01 to 2021-12-01` = c(12, 1, 12, 1, 8), `1991-12-01.to 2021-12-01` = c(5, 4, 12, 6, 14), `1981-12-01 to 2021-12-01` = c(12, 7, 12, 20, 14), `1971-12-01 to 2021-12-01` = c(19, 7, 12, 13, 14)) # 直接循环修改df,不需要赋值给data for (i in 1:nrow(df)) { df[i, -1][duplicated(df[i, -1])] <- NA } # 查看结果 print(df)
方法2:用apply函数更简洁处理
按行遍历数值列,替换重复值为NA,再转置回原格式:
df[, -1] <- t(apply(df[, -1], 1, function(x) { x[duplicated(x)] <- NA x }))
方法3:tidyverse风格(dplyr)
用rowwise按行处理,结合across和c_across实现需求:
library(dplyr) df <- df %>% rowwise() %>% mutate(across(-Site, ~ ifelse(duplicated(c_across(-Site)), NA, .x))) %>% ungroup()
最终输出结果
处理后的数据框会符合你的预期:
Site 2001-12-01 to 2021-12-01 1991-12-01.to 2021-12-01 1981-12-01 to 2021-12-01 1971-12-01 to 2021-12-01 1 Att-Bissen 12 5 NA 19 2 Alz-Ettelbruck 1 4 7 NA 3 Our-Gemund/Vianden 12 NA NA NA 4 Syre Felsmuhle/Mertert 1 6 20 13 5 Ernz Blanche-Larochette 8 14 NA NA
内容的提问来源于stack exchange,提问作者Drop
相关产品推荐
相关产品推荐

