Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按日期和id筛选重复项_R_Dataframe_Filter_Duplicates - Fatal编程技术网

R 按日期和id筛选重复项

R 按日期和id筛选重复项,r,dataframe,filter,duplicates,R,Dataframe,Filter,Duplicates,我有一个如下所示的数据框 Id Date1 Date2 QuestionId AnswerValue 10 2000-01-14 2000-01-14 1339 3 10 2000-01-14 1999-12-09 1339 2 10 2000-01-14 1999-11-23 1461 1 10 2000-01-14 2000-01-0

我有一个如下所示的数据框

Id      Date1        Date2        QuestionId   AnswerValue
10      2000-01-14   2000-01-14   1339         3
10      2000-01-14   1999-12-09   1339         2
10      2000-01-14   1999-11-23   1461         1 
10      2000-01-14   2000-01-03   1461         18
10      2000-01-14   1999-11-16   274          0
57      2014-02-01   2014-12-10   278          0
57      2014-02-01   2012-11-07   280          0
57      2014-02-01   2012-09-30   280          0 
57      2014-02-01   2012-01-15   261          0 
我的目标是根据以下标准保留观察结果

1) 保留该ID和QuestionID组合的行,其中QuestionID是唯一的,并且该ID+QuestionID组合没有其他重复的QuestionID。示例:保留最后一行

Id      Date1        Date2        QuestionId   AnswerValue
57      2014-02-01   2012-01-15   261          0 
2) 如果每个QuestionID+ID组合都有重复的QuestionID,则仅保留带有QuestionID的行,其中Date2列值最接近Date1列值,例如:ID 10有两个QuestionID 1339。根据该标准,仅应保留第1行,因为问题ID 1339的日期2值2000-01-14最接近日期1值2000-01-14,而第二行的日期2值为1999-12-09,而日期1值为2000-01-14

Id      Date1        Date2        QuestionId   AnswerValue
10      2000-01-14   2000-01-14   1339         3
3) 删除Date2值大于Date1的任何行,例如,应删除第6行

Id      Date1        Date2        QuestionId   AnswerValue
57      2014-02-01   2014-12-10   278          0
最终的数据集如下所示

Id      Date1        Date2        QuestionId   AnswerValue
10      2000-01-14   2000-01-14   1339         3
10      2000-01-14   2000-01-03   1461         18
10      2000-01-14   1999-11-16   274          0
57      2014-02-01   2014-12-10   278          0
57      2014-02-01   2012-11-07   280          0
57      2014-02-01   2012-01-15   261          0 

非常感谢为实现这一目标提供的任何帮助。提前感谢。

使用
数据。表
,首先筛选准则3(
Date2这里有一个使用
dplyr
的想法

library(dplyr)

df %>% 
  group_by(Id, QuestionId) %>% 
  slice(which.min(difftime(Date1, Date2))) %>% 
  filter(Date2 <= Date1)

#Source: local data frame [5 x 5]
#Groups: Id, QuestionId [5]

#     Id      Date1      Date2 QuestionId AnswerValue
#  <int>     <date>     <date>      <int>       <int>
#1    10 2000-01-14 1999-11-16        274           0
#2    10 2000-01-14 2000-01-14       1339           3
#3    10 2000-01-14 2000-01-03       1461          18
#4    57 2014-02-01 2012-01-15        261           0
#5    57 2014-02-01 2012-11-07        280           0
库(dplyr)
df%>%
分组依据(Id,问题Id)%>%
切片(which.min(difftime(Date1,Date2)))%>%

筛选(日期2)你的第一个标准很难遵循。第五行和第六行不也应该保留吗?你只是想要一个唯一的Id+QuestionId组合吗?在Id+QuestionId组合中,如何才能有一个唯一的QuestionId和另一个具有相同Id+QuestionId组合的观察?
Id           Date1      Date2     QuestionId   AnswerValue
57      2014-02-01   2014-12-10   278          0
library(dplyr)

df %>% 
  group_by(Id, QuestionId) %>% 
  slice(which.min(difftime(Date1, Date2))) %>% 
  filter(Date2 <= Date1)

#Source: local data frame [5 x 5]
#Groups: Id, QuestionId [5]

#     Id      Date1      Date2 QuestionId AnswerValue
#  <int>     <date>     <date>      <int>       <int>
#1    10 2000-01-14 1999-11-16        274           0
#2    10 2000-01-14 2000-01-14       1339           3
#3    10 2000-01-14 2000-01-03       1461          18
#4    57 2014-02-01 2012-01-15        261           0
#5    57 2014-02-01 2012-11-07        280           0