私は、人(ID)が一度に仕事をすることができるかどうかを示す2進マトリックスを持っています。行列の例は特定の時間に利用可能なすべての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と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")))
別のデータセット
data1 <- data.frame(ID = 1:6, Start_Time = c("8:00", "8:00", "8:30",
"8:30", "9:00", "9:30"), stringsAsFactors=FALSE)
それらの開始時間と「IDは」第三のデータセットは、特定のタスク
の開始と終了のタイミングを持っています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)
であることは
以下DATA2
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と一致しようとしましたが、道を見つけることができませんでした。 1人が仕事をしている時間枠内に2つの仕事が来る可能性もあります。私はここでそれを考慮していません。これは、行列に基づいて利用可能な初期IDを取得するだけです。
EDIT:@Audiophileすることにより、以下の解決策は、例えば動作しますが、それは、私はそれが元のデータセットで動作させるためにallow.cartesian
を使用していた重複
availability <- merge(availability,data2,by.x = 'time',by.y = 'slot',all.y = T)
を持つここに警告をスローします。私のデータセットには約2,000行があり、マージ後には約20000行以上が与えられます。この例を使用する上記のmerge
ステップも、 'availability'または 'data2'とは異なる行数を示します。他の方法がありますか?data.table
からfoverlaps
を使用していますか?
感謝を。この例ではうまくいきますが、元のデータセットの 'merge(availability、data2、by.x = 'time'、by.y = 'slot'、all.y = T)'を実行している間に重複に関するエラーが表示されます。だから、 'allow.cartesian = TRUE'を使う必要があります。コンパクトな方法はありますか? – kraj