Я уверен, что есть более элегантное решение, но оно работает. Сначала запустите lapply
над вашим вектором нужных идентификаторов, создав список фреймов данных из одной строки в соответствии с вашими спецификациями.
results <- lapply(seq(10), function(i) {
if (i %in% Dt$ID) {
Dt[which(Dt$ID==i),]
} else if (i %in% c(3,4)) {
data.frame(ID = i, Value = "y")
} else {
data.frame(ID = i, Value = "z")
}
})
Затем сверните этот список в фрейм данных. Вы также можете свернуть это на предыдущем шаге, вложив вызов в lapply
, где здесь появляется results
.
Dt2 <- do.call(rbind.data.frame, results)
Если вы не возражаете ввести зависимость от tidyverse
'или purrr
в частности, вы также можете заменить map_dfr
на lapply
в блоке кода выше, и это приведет к сворачиванию результирующего списка в один фрейм данных на том же шаге. Обратите внимание, что он также выдаст предупреждения о преобразовании фактора в символ, чтобы сделать это, даже если все эти идентификаторы были символами в первую очередь.
Вот результат. Обратите внимание, что вам все равно придется сортировать в соответствии с Value
, если вы заботитесь о группировке объектов по этой функции.
ID Value
1 1 x
2 2 x
11 3 y
12 4 y
3 5 x
13 6 z
4 7 x
5 8 x
14 9 z
15 10 z