我有一个数据框,每个人的观察结果不一致,我只想包括超过一半的观察结果。
我想先选择最后观察每个首先,然后在半年前选择最低的下一个观察。
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
我试着写一个循环,但我无法处理选择问题。 提前感谢您的任何建议
答案 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),]
})
diff
和cumsum
的丑陋混乱对每个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