我有一个 Dataframe 如下所示
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和问题ID组合的行,其中问题ID是唯一的,并且该ID+问题ID组合没有其他重复的问题ID。示例:保留最后一行
Id Date1 Date2 QuestionId AnswerValue
57 2014-02-01 2012-01-15 261 0
1.如果每个QuestionID+ID组合都有重复的QuestionID,则仅保留QuestionID中Date 2列值最接近Date 1列值的行,例如:ID 10有两个问题ID 1339。根据此标准,仅应保留第一行,因为与第二行相比,问题ID 1339的Date 2值2000 -01- 14最接近Date 1值2000-01-14,其中Date 2值为1999-12-09,而Date 1值为2000-01-14。
Id Date1 Date2 QuestionId AnswerValue
10 2000-01-14 2000-01-14 1339 3
1.删除Date 2值大于Date 1的所有行。例如,应删除第6行
Id日期1日期2问题Id答案值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
任何帮助实现这一点是非常感谢。先谢谢你了。
2条答案
按热度按时间von4xj4u1#
这里有一个使用
dplyr
的想法,备注
确保日期列设置为
as.Date
6qqygrtg2#
使用
data.table
,首先在标准3(Date2 <= Date1
)上进行过滤,然后只返回Date1 - Date2
最小的行(即日期彼此最接近),并使用by = .(Id, QuestionId)
为Id
和QuestionId
的每个唯一组合执行此操作:请注意,在最后的数据示例中,该行不符合第三个标准(
Date2 <= Date1
):