将重复项转换为 NA

问题描述 投票:0回答:1

我想将每个站点的重复值替换为 NA 并保留从左到右出现的第一个重复值。

例如,在站点“Alz-Ettelbruck”上,值“7”在第 4 列和第 5 列中重复。这意味着只有该站点的第 5 列应返回 NA。数字 12 在“Our-Gemund/Vianden”网站的所有列中重复,因此我想将 12 保留在第 2 列中,但其余的应替换为 NA。

为此,我使用了重复的函数,但它返回“NULL”。

为了重现该问题,我使用了以下数据框,并在最后指出了所需的输出。

任何帮助将不胜感激。预先感谢您。


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))


# Replace repeated values with NA per row
data <- for (i in 1:nrow(df)) {
  df[i, -1][duplicated(df[i, -1])] <- NA
}

以下是我希望脚本返回的内容:

r duplicates na
1个回答
0
投票

这不是“最好的”(因为混合类框架上的

apply
会在内部强制所有内容),但这是有效的:

df[t(apply(df, 1, duplicated))] <- NA
df
#                      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
© www.soinside.com 2019 - 2024. All rights reserved.