【问题标题】:Select only observations in a df that are minimally a half year apart, starting from the last observation从最后一次观察开始,仅选择 df 中至少相隔半年的观察值
【发布时间】:2016-05-03 06:22:12
【问题描述】:

我的问题介绍

我有一个数据框,每个人的观察结果不相等,我只想包括相差超过一半的观察结果。
我想选择first每个人的last观察,然后选择半年前最少的下一个观察。

示例 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

我尝试过的

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

【问题讨论】:

  • 您能否添加语言/图书馆标签,以便跟踪这些标签的人看到您的问题。这是一个 R 数据框或 Python/Pandas 还是 Spark?
  • 感谢您的建议!我添加了标签。
  • 你的数据有多大(也就是说,效率有多重要)?
  • 只有几千个观察结果
  • 我不确定ID=100 的输出是否正确。可以验证吗?

标签: r dataframe selection


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-11
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-27
    相关资源
    最近更新 更多