Как заменить текущее значение в строке следующим (или предыдущее значение в том же столбце данных)? - PullRequest
0 голосов
/ 22 декабря 2018

Заранее извиняюсь, если раньше об этом спрашивали, но все, что я могу найти, - это как заменить АН;никогда не соответствуя конфигурации, с которой я сталкиваюсь здесь.В этом случае я просто хотел бы заменить 0 на значение следующего ряда.Также поможет пример с отображением предыдущей строки (хотя я предполагаю, что он должен быть достаточно близок к отображению следующей строки).

Ниже приведен фрагмент кода, который работает, но работает очень медленно при применении кбольшой кадр данных.Я думал, что должно быть лучшее решение, возможно, с использованием lapply ().Обратите внимание, что в отличие от приведенного здесь примера, реальный фрейм данных не имеет ничего для «группировки», поэтому dplyr может не быть опцией.Еще раз спасибо

iris$ind <- seq_along(iris$Sepal.Length)
iris$ind <- ifelse(iris$ind %% 2 == 0, 0, iris$ind)

for(i in seq_along(iris$ind)){

  ifelse(iris$ind[i] == 0, 
         iris$ind[i] <- iris$ind[i + 1], iris$ind )  

}

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Полагаю, вы хотите использовать fill из dplyr, но это работает только при заполнении значений NA предыдущими или следующими значениями.Итак, почему бы вам не заменить значения 0 на значения NA, а затем использовать fill.Для этого вы можете использовать mutate в dplyr, например:

iris <- iris %>% mutate(ind = ifelse(ind == 0, NA, ind)) %>% fill(ind)

По умолчанию .direction из fill равно "down", что означает замену 0 на предыдущуюзначение.Чтобы заменить 0 его следующим значением, вам нужно изменить .direction на "up", например:

iris <- iris %>% mutate(ind = ifelse(ind == 0, NA, ind)) %>% fill(ind, .direction="up")

Надеюсь, это поможет.

0 голосов
/ 22 декабря 2018

Вы можете попробовать использовать lead из пакета dplyr:

iris$ind <- ifelse(iris$ind == 0,
                   lead(iris$ind, order_by=iris$Sepal.Length),
                   iris$ind)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...