R 如果同一期间有质量良好的数据,请删除质量较差的列

R 如果同一期间有质量良好的数据,请删除质量较差的列,r,if-statement,data-manipulation,R,If Statement,Data Manipulation,我有以下问题:我的数据包含好的和坏的质量数据。例如,在2017年12月31日,我有一列质量良好的数据(质量=a),值为800,质量不良的数据(质量=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 示例数据

我有以下问题:我的数据包含好的和坏的质量数据。例如,在2017年12月31日,我有一列质量良好的数据
(质量=a)
,值为800,质量不良的数据
(质量=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))

我试图用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
库(dplyr)
df%>%
分组单位(时间)%>%
切片(第一个(na.省略(匹配(c('a','b'),质量)))%>%
解组
#质量时间价值
#           
#1A 2017-12-31 800
#2 a 2018-12-31 500
#3B 2019-12-31200

您可以在
匹配的帮助下执行此操作:

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
库(dplyr)
df%>%
分组单位(时间)%>%
切片(第一个(na.省略(匹配(c('a','b'),质量)))%>%
解组
#质量时间价值
#           
#1A 2017-12-31 800
#2 a 2018-12-31 500
#3B 2019-12-31200

您可以通过按质量排序,然后按时间进行重复数据消除来做到这一点

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

进行同样的操作,方法是按质量排序,然后按时间消除重复

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

感谢您的支持。但由于我的真实数据更为复杂,很遗憾,这不起作用。但是谢谢!没问题。你能解释一下为什么它对你的数据不起作用吗?可能对我有帮助。我实际上有两个以上的质量标准,比如“c”,但在那个时期没有其他数据,只有c质量。此外,质量不是作为“a”、“b”等的reportet,而是作为另一个字符串。此外,我有不同的个人为每一个价值观等,这使一切更加复杂。所以时间不能是唯一的,但是在你的解决方案中只有唯一的时间。但是谢谢你的帮助,这就是为什么我对你的问题投了更高的票:)啊,这是有道理的——两个以上的值是可以的,但是其他部分可能会导致问题,如果没有group_by,或者可能是非词典排序。谢谢你让我知道!谢谢你的邀请。但由于我的真实数据更为复杂,很遗憾,这不起作用。但是谢谢!没问题。你能解释一下为什么它对你的数据不起作用吗?可能对我有帮助。我实际上有两个以上的质量标准,比如“c”,但在那个时期没有其他数据,只有c质量。此外,质量不是作为“a”、“b”等的reportet,而是作为另一个字符串。此外,我有不同的个人为每一个价值观等,这使一切更加复杂。所以时间不能是唯一的,但是在你的解决方案中只有唯一的时间。但是谢谢你的帮助,这就是为什么我对你的问题投了更高的票:)啊,这是有道理的——两个以上的值是可以的,但是其他部分可能会导致问题,如果没有group_by,或者可能是非词典排序。谢谢你让我知道!