我已經搜索過SO,以便實現我所需要的運行方式,所以它就這樣走了。 後來我發現了包dplyr及其潛力。我在想這個軟件包可以做我想做的,我只是不知道如何。這是我的數據的一小部分,但應該代表我的問題。dplyr mutate函數垂直地評估列(當前,上一個,下一個)內的值
dummy<-structure(list(time = structure(1:20, .Label = c("2015-03-25 12:24:00",
"2015-03-25 21:08:00", "2015-03-25 21:13:00", "2015-03-25 21:47:00",
"2015-03-26 03:08:00", "2015-04-01 20:30:00", "2015-04-01 20:34:00",
"2015-04-01 20:42:00", "2015-04-01 20:45:00", "2015-09-29 18:26:00",
"2015-09-29 19:11:00", "2015-09-29 21:21:00", "2015-09-29 22:03:00",
"2015-09-29 22:38:00", "2015-09-30 00:48:00", "2015-09-30 01:38:00",
"2015-09-30 01:41:00", "2015-09-30 01:45:00", "2015-09-30 01:47:00",
"2015-09-30 01:49:00"), class = "factor"), ID = c(1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L), station = c(1L, 1L, 1L, 2L, 3,
4L, 4L, 4L, 4L, 5L, 5L, 6L,
6L, 5, 5, 5L, 7, 7, 7L,
7)), .Names = c("time", "ID", "station"), class = "data.frame", row.names = c(NA,
-20L))
我希望根據ID和站列來評估時間列內的行。具體來說,我希望函數(dplyr?)能夠評估每個時間行,並將時間與前一時間(第一行)和第二行(第一行)進行比較。如果當前行的時間在上一行和/或下一行的1小時內,並且當前行的ID和工作站與前一行和/或下一行的時間匹配,那麼我想在新行中添加1 ,否則爲0.
我將如何使用dplyr來實現此目的?
預期的結果應該是這樣的:
time ID station new.value
1 2015-03-25 12:24:00 1 1 0
2 2015-03-25 21:08:00 1 1 1
3 2015-03-25 21:13:00 1 1 1
4 2015-03-25 21:47:00 1 2 0
5 2015-03-26 03:08:00 1 3 0
6 2015-04-01 20:30:00 1 4 1
7 2015-04-01 20:34:00 1 4 1
8 2015-04-01 20:42:00 1 4 1
9 2015-04-01 20:45:00 1 4 1
10 2015-09-29 18:26:00 2 5 1
11 2015-09-29 19:11:00 2 5 1
12 2015-09-29 21:21:00 2 6 1
13 2015-09-29 22:03:00 2 6 1
14 2015-09-29 22:38:00 2 5 0
15 2015-09-30 00:48:00 2 5 1
16 2015-09-30 01:38:00 2 5 1
17 2015-09-30 01:41:00 2 7 1
18 2015-09-30 01:45:00 2 7 1
19 2015-09-30 01:47:00 2 7 1
20 2015-09-30 01:49:00 2 7 1
我不認爲你需要dplyr,我想你只需要一對夫婦'diff'操作。請注意,「類」POSIXct「表示自1970年開始(在UTC時區)以秒爲單位的(有符號)秒數」。所以你會希望查找小於3600秒的差異。 – C8H10N4O2
不確定'dplyr',但data.table有滾動連接,似乎以最有效的方式解決您的問題。最近的一篇文章詳細描述了該功能:[瞭解data.table滾動聯接](http://r-norberg.blogspot.co.uk/2016/06/understanding-datatable-rolling-joins.html)。提供一個小時即可使用60 * 60(因爲POSIXct是秒數)。這樣你就可以使用二進制合併來檢測這些行。如果純粹的表現不是你的目標,那麼'shift(x)'或'c(NA,x [ - 。N])'/'c(x [-1L],NA)'應該足以創建列來比較。 – jangorecki