如果同一时期有质量好的数据,则删除质量差的列
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)),]
做同样的事情。
我遇到以下问题:我的数据包含质量好的数据和质量差的数据。所以例如在 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)),]
做同样的事情。