假设我有一个如下数据框,
ID date difference
1 5/1/2016 4:46 NA
2 5/1/2016 4:55 9
3 5/1/2016 5:01 6
4 5/1/2016 5:09 8
5 5/1/2016 5:16 7
6 5/1/2016 5:24 8
7 5/1/2016 5:31 7
8 5/1/2016 5:40 9
9 5/1/2016 5:46 6
10 5/1/2016 5:49 3
11 5/1/2016 5:54 5
12 5/1/2016 5:57 3
13 5/1/2016 6:10 13
这里我想过滤时间差大于或等于9的条目。我想在时差值为9之前过滤两个条目,之后过滤一个条目。基本上我想分析时差大于9分钟时的趋势。所以我想在它之前拿两个条目,之后拿一个条目,这样我就会有每个时间条目块有4个条目要调查。
我可以直接使用一个条目
过滤它data %>% filter(difference >= 9)
但是我想在它之前拿两个条目,然后在它之后拿一个条目进行调查。理想情况下,我的输出应该是,
ID date difference
1 5/1/2016 4:46 NA
2 5/1/2016 4:55 9
3 5/1/2016 5:01 6
6 5/1/2016 5:24 8
7 5/1/2016 5:31 7
8 5/1/2016 5:40 9
9 5/1/2016 5:46 6
11 5/1/2016 5:54 5
12 5/1/2016 5:57 3
13 5/1/2016 6:10 13
每当时差大于或等于9时,我在录入前有两个,在录入后有一个。
有人能告诉我如何解决这个问题吗?
由于
答案 0 :(得分:2)
注意:我使用了一个占位符系列" date"因为它在这段代码的上下文中并不重要。
据我所知,没有单一命令方式来做你需要的事情。我建议用循环来做这个:
df <- data.frame(1:13)
df <- cbind(df,2000:2012,c(NA,9,6,8,7,8,7,9,6,3,5,3,13))
colnames(df) <- c("ID","date","difference")
whichAtLeast9 <- which(df$difference >= 9)
wantedRows <- whichAtLeast9
for (i in whichAtLeast9) {
entries_before <- c(i-1,i-2)
entries_before <- subset(entries_before,entries_before>0)
wantedRows <- append(wantedRows,entries_before)
entries_after <- i+1
entries_after <- subset(entries_after,entries_after<=13)
wantedRows <- append(wantedRows,entries_after)
}
# Remove duplicates and sort.
wantedRows <- sort(unique(wantedRows))
finaldf <- df[wantedRows,]
结果:
> finaldf
ID date difference
1 1 2000 NA
2 2 2001 9
3 3 2002 6
6 6 2005 8
7 7 2006 7
8 8 2007 9
9 9 2008 6
11 11 2010 5
12 12 2011 3
13 13 2012 13
答案 1 :(得分:1)
您可以在shift
中尝试Reduce
,data.table
方法,假设dt
是您的data.frame:
library(data.table)
setDT(dt)
dt[Reduce("|", c(shift(difference >= 9, n = 0:1, type = "lag"),
shift(difference >=9, n = 1:2, type = "lead")))]
ID date difference
1: 5/1/2016 4:46 NA
2: 5/1/2016 4:55 9
3: 5/1/2016 5:01 6
4: 5/1/2016 5:24 8
5: 5/1/2016 5:31 7
6: 5/1/2016 5:40 9
7: 5/1/2016 5:46 6
8: 5/1/2016 5:54 5
9: 5/1/2016 5:57 3
10: 5/1/2016 6:10 13