Ссылка на предыдущую строку в data.frame - PullRequest
0 голосов
/ 30 мая 2019

У меня очень простая проблема. Я пытаюсь установить значение столбца 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? Такое ощущение, что должно быть.

Спасибо

Ответы [ 3 ]

1 голос
/ 30 мая 2019

С учетом

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

0 голосов
/ 30 мая 2019

Другой 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

data

df <- structure(list(Y = c(1L, 1L, 2L, 2L), X = c(5L, 1L, 0L, 2L)), 
  class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 30 мая 2019

Аналогично сообщению от @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
...