我想将每个站点的重复值替换为NA,并保留从左到右显示的第一个重复值.

例如,在站点"Alz-Ettelbruck"上,值"7"在第4列和第5列中重复,这意味着只有该站点的第5列应该返回NA.数字12在网站"Our-Gemund/Vianden"的所有列中重复,所以我想保留第2列中的12,但其余的应该替换为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
}

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

enter image description here

推荐答案

(Edit:BASE-R和dplyr+tidyr代码的第一个版本都使用了duplicated,这将错误地删除第1行第4列中的12.它已被编辑为不使用duplicated.)

base R

将列与更新列进行比较的约简.

df[,-1] <- Reduce(
  function(prev, this) replace(this, is.na(prev) | this == prev, this[NA][1]),
  df[,-1], accumulate = TRUE)
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                       12                       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

我在两个地方都硬编码了df[,-1],它也可以很容易地也是df[,2:5],它只需要在两个地方是相同的(<-的LHS和Reduce内).

dplyr+tidyr

这失go 了一些效率,因为它是双枢轴的.

library(dplyr)
library(tidyr) # pivot_*
df %>%
  pivot_longer(cols = -Site) %>%
  arrange(Site, desc(name)) %>%
  mutate(.by = "Site", value = if_else(value == lag(value, default=-1L), value[NA], value)) %>%
  pivot_wider(id_cols = Site) %>%
  slice(match(Site, df$Site)) %>%
  select(match(names(.), names(df)))
# # A tibble: 5 × 5
#   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`
#   <chr>                                        <dbl>                      <dbl>                      <dbl>                      <dbl>
# 1 Att-Bissen                                      12                          5                         12                         19
# 2 Alz-Ettelbruck                                   1                          4                          7                         NA
# 3 Syre Felsmuhle/Mertert                           1                          6                         20                         13
# 4 Ernz Blanche-Larochette                          8                         14                         NA                         NA
# 5 Our-Gemund/Vianden                              12                         NA                         NA                         NA

旋转的一个副作用是不能保证恢复行和列的顺序,所以我在末尾添加了最美观的slice(.) %>% select(.),以便与您的输入数据相匹配.(这完全不是必需的.)


数据

df <- structure(list(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)), class = "data.frame", row.names = c(NA, -5L))

R相关问答推荐

从多个前置日期中获取最长日期

在R中查找每个组不同时间段的总天数

R箱形图gplot 2 4组但6个参数

将复杂的组合列表转换为数据框架

根据多个条件增加y轴高度以适应geom_text标签

计算具有奇数日期的运行金额

在ggplot2中更改小提琴情节的顺序

计算数据帧中指定值之前的行数,仅基于每行之后的future 行,单位为r

如何通过匹配R中所有可能的组合来从宽到长旋转多个列?

解析嵌套程度极高的地理数据

使用ggplot2中的sec_axis()调整次轴

将列的值乘以在不同数据集中找到的值

删除字符串R中的重复项

自定义交互作用图的标签

TidyVerse中长度不等的列结合向量

如何调整一个facet_work()面板内的框图和移动标签之间的水平宽度?

如何在Quarto中使用美人鱼图表中的标记来加粗文本

R没有按顺序显示我的有序系数?

通过不完全重叠的多个柱连接

如何在分组蜂群小区中正确定位标签