我有一個二進制矩陣,用於指示某個人(ID)是否一次可用於執行任務。示例矩陣是在特定時間查找所有可用的ID
08:00 08:30 09:00 09:30 10:00 10:30 11:00 11:30 12:00 12:30 13:00 13:30 14:00 14:30 15:00 15:30 16:00 16:30 17:00 17:30 18:00 18:30 19:00
1 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0
2 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0 0
3 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0
4 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0 0
5 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0
6 0 0 1 1 1 1 1 0 1 1 1 1 0 1 1 1 1 1 1 1 0 0 0
19:30
1 0
2 0
3 0
4 0
5 0
6 0
行名稱代表ID,顯示的時間是ID可用的時間。在該示例中,ID 1和ID 2在8:00開始工作,並且在10:30-11:00,13:00-13:30具有特定的休息時間段。開始半小時後3點和4點的人在11:00-11:30,13:30-14:00休息。這是爲了確保有人可以做任何可以在任何特定時間開始的工作。
dput(矩陣)
structure(c(1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1,
0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0), .Dim = c(6L, 24L), .Dimnames = list(c("1", "2", "3", "4",
"5", "6"), c("08:00", "08:30", "09:00", "09:30", "10:00", "10:30",
"11:00", "11:30", "12:00", "12:30", "13:00", "13:30", "14:00",
"14:30", "15:00", "15:30", "16:00", "16:30", "17:00", "17:30",
"18:00", "18:30", "19:00", "19:30")))
另一個數據集有「的ID」以及它們的開始時間
data1 <- data.frame(ID = 1:6, Start_Time = c("8:00", "8:00", "8:30",
"8:30", "9:00", "9:30"), stringsAsFactors=FALSE)
第三數據集將有開始和結束的定時爲特定任務
data2 <- data.frame(Start = c("8:01", "9:35", "10:42", "11:25", "14:22",
"17:20", "18:19"), End = c("8:22", "9:42", "11:20", "11:32",
"14:35", "18:15", "18:25"), stringsAsFactors=FALSE)
我正在嘗試在data2中創建一個列,以便根據在data2中開始時間。預期的輸出是
data2$IdsAvail <- c("1, 2", "1, 2, 3, 4, 5, 6", "3, 4, 5, 6",
"1, 2, 5, 6", "1, 2, 3, 4", "3, 4, 5, 6", NA)
它看起來像下面
數據2
Start End IdsAvail
1 8:01 8:22 1, 2
2 9:35 9:42 1, 2, 3, 4, 5, 6
3 10:42 11:20 3, 4, 5, 6
4 11:25 11:32 1, 2, 5, 6
5 14:22 14:35 1, 2, 3, 4
6 17:20 18:15 3, 4, 5, 6
7 18:19 18:25 <NA>
試過的ID與基質中的時間相匹配,但無法找到一個方法。在一個人從事某項工作的時間範圍內,也可能會有兩項工作。我在這裏沒有考慮到這一點。這只是爲了獲得基於矩陣的初始ID。
編輯:由@Audiophile以下解決方案適用於的例子,但它拋出這裏警告有重複
availability <- merge(availability,data2,by.x = 'time',by.y = 'slot',all.y = T)
我不得不用allow.cartesian
使其在原始數據集工作。我的數據集大約有2000行,使用合併後,它會產生大約20000行。以上使用此示例的merge
步驟也給出不同於「可用性」或「數據2」的行數。是否有其他方法,即使用data.table
的foverlaps
?
感謝您的答覆。它在這個例子中工作正常,但在原始數據集中運行'merge(available,data2,by.x ='time',by.y ='slot',all.y = T)'時顯示重複錯誤。所以,我必須使用'allow.cartesian = TRUE'有沒有簡潔的方法? – kraj