Итак, у меня есть два набора данных, представляющие старый и текущий адрес.R - объединить и обновить первичный набор данных
> main
idspace id x y move
198 1238 33 4 stay
641 1236 36 12 move
1515 1237 30 28 move
> move
idspace id x y move
4 1236 4 1 move
Что мне нужно, чтобы объединить новые данные (move
) со старым (main
) и обновлять main
раз слиты.
Мне было интересно, если бы это было возможно за одну операцию?
Обновление составлено на основе id
, являющимся личным идентификатором.
idspace
, x
, y
- идентификатор местоположения.
Таким образом, выход мне нужно
> main
idspace id x y move
198 1238 33 4 stay
4 1236 4 1 move # this one is updated
1515 1237 30 28 move
Я понятия не имею, как я могу это сделать.
Что-то вроде
merge(main, move, by = c('id'), all = T, suffixes = c('old', 'new'))
Однако, это неправильно, потому что мне нужно сделать так много манипуляций вручную.
Любое решение?
данные
> dput(main)
structure(list(idspace = structure(c(2L, 3L, 1L), .Label = c("1515",
"198", "641"), class = "factor"), id = structure(c(3L, 1L, 2L
), .Label = c("1236", "1237", "1238"), class = "factor"), x = structure(c(2L,
3L, 1L), .Label = c("30", "33", "36"), class = "factor"), y = structure(c(3L,
1L, 2L), .Label = c("12", "28", "4"), class = "factor"), move = structure(c(2L,
1L, 1L), .Label = c("move", "stay"), class = "factor")), .Names = c("idspace",
"id", "x", "y", "move"), row.names = c(NA, -3L), class = "data.frame")
> dput(move)
structure(list(idspace = structure(1L, .Label = "4", class = "factor"),
id = structure(1L, .Label = "1236", class = "factor"), x = structure(1L, .Label = "4", class = "factor"),
y = structure(1L, .Label = "1", class = "factor"), move = structure(1L, .Label = "move", class = "factor")), .Names = c("idspace",
"id", "x", "y", "move"), row.names = c(NA, -1L), class = "data.frame")`
Я думаю, что это дуп, как 'tmp <- rbind (move, main); tmp [! duplicated (tmp $ id),] 'логика работает очень хорошо, предполагая, что здесь нет других требований. – thelatemail
@thelatemail Я думал об использовании 'sqldf', но я не знаю, что API достаточно хорошо, чтобы ответить. –
@TimBiegeleisen - может быть, 'sqldf (» выберите COALESCE (b.idspace, a.idspace), как idspace, сливаются (b.id, A.id) в качестве идентификатора, сливаются (BX, AX) при х, сливаются (by, ay) as y, coalesce (b.move, a.move) в качестве хода от основного a left join move b по a.id = b.id ")' - уродливый, но он действительно работает. – thelatemail