如果同一时期有质量好的数据,则删除质量差的列

Remove a column with bad quality data if there is good quality data for the same period

我遇到以下问题:我的数据包含质量好的数据和质量差的数据。所以例如在 2017 年 12 月 31 日,我有一个列,其质量数据 (Quality = a) 的值为 800,质量差的数据 (Quality = b) 的值为 750。

  Quality       Time Value
1       a 2017-12-31   800
2       a 2018-12-31   500
3       b 2017-12-31   750
4       b 2018-12-31   480
5       b 2019-12-31   200

示例数据框:

df <- data.frame(Quality = c("a", "a", "b", "b", "b"), Time = c("2017-12-31", "2018-12-31", "2017-12-31", "2018-12-31", "2019-12-31"), Value = c(800, 500, 750, 480, 200))

只有当每个时期 (Time).

没有“优质”数据 (Quality = a) 时,我才想保留“劣质”数据 (Quality = b)

因此,预期的输出是:

  Quality       Time Value
1       a 2017-12-31   800
2       a 2018-12-31   500
3       b 2019-12-31   200

我试图用 if 语句解决这个问题,但失败了。我的真实数据有超过 10000 行和多个日期。感谢任何帮助。

您可以在 match 的帮助下完成此操作:

library(dplyr)

df %>%
  group_by(Time) %>%
  slice(first(na.omit(match(c('a', 'b'), Quality)))) %>%
  ungroup

#  Quality Time       Value
#  <chr>   <chr>      <dbl>
#1 a       2017-12-31   800
#2 a       2018-12-31   500
#3 b       2019-12-31   200

您可以通过按质量排序然后按时间去重来实现。

library(dplyr)
df %>%
arrange(Quality) %>% #sort by quality so a is first
distinct(Time, .keep_all = TRUE) #keep only the first row for each time value and keep all columns

如果您更喜欢 base R,您可以使用 order(Quality)df[which(!duplicated(df$Time)),] 做同样的事情。