У меня очень простая проблема. Я пытаюсь установить значение столбца X равным 0, если столбец Y[n,] не равен столбцу Y[n-1,]. Моя проблема в том, что я не знаю, как ссылаться на значение предыдущей строки в R, а затем использовать это значение для установки значения другого столбца.
Например:
Y X
1 5
1 1
2 0
2 2
X[3,2] равно 0, потому что Y[3,1] не равно Y[2,1].
Мне нужно в основном найти все экземпляры этого в большом наборе данных и установить соответствующее значение X равным 0.
data$X <- 0 if data$Y[n] =! data$Y[n-1]
Есть ли простое решение для этого в R? Такое ощущение, что так и должно быть.
Спасибо
Дано
Y <- c(1, 1, 2, 2)
X <- c(5, 1, 10, 2)
вариант был бы diff
X * (c(0, diff(Y)) == 0)
# [1] 5 1 0 2
Идея состоит в том, чтобы проверить, равен ли x [i] - x [i -1] нулю, что дает логический вектор, который мы умножаем на X
Как и в посте @markus, с помощью dplyr
вы можете:
df %>%
mutate(X = (Y == lag(Y, default = first(Y))) * X)
Y X
1 1 5
2 1 1
3 2 0
4 2 2
Еще base R
вариант
with(df, X * c(TRUE, !(Y[-1] - Y[-length(Y)])))
#[1] 5 1 0 2
Или с помощью dplyr
library(dplyr)
df %>%
mutate(X = c(X[1], ((duplicated(Y) * X)[-1])))
# Y X
#1 1 5
#2 1 1
#3 2 0
#4 2 2
df <- structure(list(Y = c(1L, 1L, 2L, 2L), X = c(5L, 1L, 0L, 2L)),
class = "data.frame", row.names = c(NA, -4L))
Если один из ответов решает вашу проблему, рассмотрите его принимать. Спасибо