根据ID和日期提取行。 R-基

时间:2017-07-03 16:40:04

标签: r

我有2个数据框。一个有ID列表和700个人的日期,另一个有400.000行日期和其他几个变量超过1000人。 例如df1:

ID        date
1010      2014-05-31
1011      2015-08-27
1015      2011-04-15
...

示例df2:

ID         Date           Operationcode
1010       2008-01-03     456
1010       2016-06-09     1234
1010       1999-10-04     123186
1010       2017-02-30     71181
1010       2005-05-05     201
1011       2008-04-02     46
1011       2009-09-09     1231
1515       2017-xx-xx     156
1015       2013-xx-xx     123
1615       1998-xx-xx     123
1015       2005-xx-xx     4156
1015       2007-xx-xx     123
1015       2016-xx-xx     213

现在我想创建一个df3,其中我只保留df2中的行,其中日期在df1之前(当与ID匹配时)。

所以我得到了:

    ID         Date           Operationcode
    1010       2008-01-03     456
    1010       1999-10-04     123186
    1010       2005-05-05     201
    1015       2005-xx-xx     4156
    1015       2007-xx-xx     123

我试过

df3 <- subset(df1, ID %in% df2$ID & df2$date < df1$date)

但是继续给我一个错误,其中有一个长度与最后一部分df2$date < df1$date不匹配的东西,当我拿一个sampletest(寻找1个ID的操作码)时,我可以看到我错过了很多从df1开始的日期之前的行。任何想法或解决方案?

我只有base-R作为其医院计算机,不允许任何下载-.-

1 个答案:

答案 0 :(得分:0)

在基地R你可以做这样的事情......

df3 <- merge(df2,df1,by="ID",all.x=TRUE) #merge in df1 date column
df3 <- df3[as.Date(df3$Date)<as.Date(df3$date),] #remove rows with invalid dates
#note that 'Date' is the df2 column, 'date' is the df1 version
df3 <- df3[!is.na(df3$ID),] #remove NA rows
df3$date <- NULL #remove df1 date column

df3
    ID       Date Operationcode
1 1010 2008-01-03           456
2 1010 1999-10-04        123186
3 1010 2005-05-05           201
6 1011 2009-09-09          1231
7 1011 2008-04-02            46

我不确定数据中xx的日期会发生什么。他们是真的吗?如果它们出现在实际数据中,则需要进行特殊处理,否则它们将无法转换为正确的日期格式,因此计算失败。