По сути, я хочу интерполировать, используя R, когда значение отличается только в одном случае (в данном случае в месяц). Допустим, мои данные выглядят так:
df <- data.frame(id = c(1,1,1,1,1,1,2,2,2,2,2,2),
month = c(1,2,3,4,5,6,1,2,3,4,5,6),
status = c('a', 'a', 'b', 'a', 'b', 'b', 'a', 'a', 'b', 'b', 'b', 'b'))
Как интерполировать внутри идентификаторов, когда статус возникает только один раз в последовательности. В моем примере я хочу изменить первый b (строка 3) на a, но ни один из остальных менять не нужно.
Что должно произойти с a, a, b, a, b, a, b, b
?
Статус не является двоичным, и a, a, b, a, b, b должно стать a, a, a, a, b, b.
Каков ожидаемый результат для c, a, b, c, a, b, c, b, a, a, a
? Вам необходимо определить четкие правила.
@Роланд, это справедливо. Я предполагаю, что идея заключается в том, что одна запись в последовательности может быть ошибкой или иным образом не иметь значения. Итак, в вашем примере ожидаемый результат будет таким же, как входные данные. Я хочу адаптировать одно значение, когда оно окружено другими значениями, одинаковыми друг с другом: например. а,а,а,б,а,а,а -> а,а,а,а,а,а,а и а,б,в,г,в,а,б -> а,б,в, в, в, а, б
Я не уверен, хотите ли вы сыграть в скользящее окно, чтобы заменить «выброс» его соседями. Если да, возможно, приведенный ниже код должен соответствовать вашей цели (при условии, что скользящее окно перемещается слева направо)
f <- \(x) {
l <- length(x)
if (x[2]==x[3] && x[2]!=x[1]) {
x[1] <- x[2]
}
if (x[l-1]==x[l-2] && x[l-1]!=x[l]) {
x[l] <- x[l-1]
}
for (i in 2:(length(x) - 1)) {
if (x[i + 1] == x[i - 1] && x[i] != x[i + 1]) {
x[i] <- x[i + 1]
}
}
x
}
тогда ты получишь
> f(c("a", "a", "b", "a", "b", "a", "b", "b"))
[1] "a" "a" "a" "a" "a" "a" "b" "b"
> f(c("a", "b", "b"))
[1] "b" "b" "b"
> f(c("b", "b", "a"))
[1] "b" "b" "b"
> f(c("a", "b", "c", "d", "c", "a", "b"))
[1] "a" "b" "c" "c" "c" "a" "b"
Что делать, если есть ведущий или конечный одиночный элемент? Например. a, b, b, b
или b, b, b, a
Это выглядит великолепно, спасибо. Как обрабатываются ведущие или конечные элементы (как упоминал Даррен Цай). Чтобы сделать это внутри идентификаторов, я думаю, я могу вложить это еще один цикл for?
@DarrenTsai ага, спасибо за интересный пример. Я обновил свое решение и надеюсь, что оно также сможет справиться с пограничными случаями.
@business_of_ferrets, ты можешь посмотреть мои новости
Производительность будет выше, если вы обработаете второй и третий if
вне цикла.
@Роланд, да, это имеет смысл, спасибо за совет!
Является ли
status
двоичным или может быть, например, третья буква «c»?