从最后一次观察开始,仅选择相隔至少半年的df中的观测值

时间:2016-05-02 19:14:59

标签: r dataframe selection

我的问题简介

我有一个数据框,每个人的观察结果不一致,我只想包括超过一半的观察结果。
我想先选择最后观察每个首先,然后在半年前选择最低的下一个观察。

示例df

ID     Date        Var1 ... Var12
100    13/02/2012    x       x
100    14/09/2012    x       x
100    31/01/2013    x       x
100    18/12/2012    x       x
101    29/04/2012    x       x
102    01/11/2012    x       x
103    12/08/2012    x       x
103    22/08/2013    x       x
103    26/09/2013    x       x
103    22/01/2014    x       x
104    19/01/2012    x       x 
104    17/02/2014    x       x
104    15/03/2014    x       x
104    12/05/2015    x       x

在选择正确的观察结果后,预期的df看起来应该是这样的

ID     Date        Var1 ... Var12
100    13/02/2012    x       x
100    14/09/2012    x       x
100    18/12/2013    x       x
101    29/04/2012    x       x
102    01/11/2012    x       x
103    12/08/2012    x       x
103    22/08/2013    x       x
103    22/01/2014    x       x
104    19/01/2012    x       x 
104    17/02/2014    x       x
104    12/05/2015    x       x

我尝试了什么

我试着写一个循环,但我无法处理选择问题。 提前感谢您的任何建议

1 个答案:

答案 0 :(得分:0)

这很难看,但似乎有效。加载一些东西:

library(data.table)
library(plyr)

dt <- fread("ID     Date        Var1 Var12
100    13/02/2012    x       x
100    14/09/2012    x       x
100    31/01/2013    x       x
100    18/12/2012    x       x
101    29/04/2012    x       x
102    01/11/2012    x       x
103    12/08/2012    x       x
103    22/08/2013    x       x
103    26/09/2013    x       x
103    22/01/2014    x       x
104    19/01/2012    x       x 
104    17/02/2014    x       x
104    15/03/2014    x       x
104    12/05/2015    x       x")

df <- as.data.frame(dt)
df$Date <- as.Date(df$Date, format="%d/%m/%Y")

工作一些diff魔法。请注意,您可以将threshold更改为您想要的任何内容。

threshold <- 180
ddply(df, .(ID), function(x) {
    x <- x[order(x[,2], decreasing=T),]
    sel <- diff(x[,2]) < -threshold
    sel2 <- diff(x[,2])
    sel2[!sel] <- cumsum(as.numeric(diff(x[,2])))[!sel]

    x[c(1,which(sel2 < -threshold)+1),]
})

diffcumsum的丑陋混乱对每个ID执行以下操作:

  • 按日期降序排序
  • 计算观察之间的日期差异,并标记哪些超过threshold
  • 将日期差异替换为未标记
  • 的观察值的累计金额
  • 抓住现在标有
  • 的那些

    ID       Date Var1 Var12
1  100 2013-01-31    x     x
2  100 2012-02-13    x     x
3  101 2012-04-29    x     x
4  102 2012-11-01    x     x
5  103 2014-01-22    x     x
6  103 2012-08-12    x     x
7  104 2015-05-12    x     x
8  104 2014-03-15    x     x
9  104 2014-02-17    x     x
10 104 2012-01-19    x     x