Как ссылаться на другие столбцы в ifelse, используя dplyr mutate - PullRequest
1 голос
/ 21 января 2020

Пример набора данных ниже. Когда temp.change == 0, я бы хотел, чтобы R просто скопировал статус ячейки выше в столбце X в новый столбец. Я создал другой столбец, сдвинув данные в столбце X вниз, чтобы ссылаться на него. Другими словами, если temp.change == 0, то сделать X = X_shifted. Я понимаю, что если в строке несколько нулей, это также может быть проблемой с этим методом. Двоичный столбец X является результатом многих операторов ifelse о столбце temp.change

temp.change     X   X_shifted
9.5             1     NA
1               1     1
-0.5            1     1
-1              0     1
-0.5            0     0
0               1     0
0               1     1
3               1     1          
0               0     1          
1               1     0

Существует ли способ ссылки на другой столбец в операторе ifelse? Я бы предпочел попытаться найти способ сделать это, используя dplyr, так как у меня очень большой набор данных, и он довольно быстрый. Я попробовал приведенный ниже код и несколько не dplyr методов без какого-либо успеха.

  mutate(X_fixed = ifelse(temp.change_prev==0, X_shifted, X))

Ожидаемый результат:

temp.change     X   X_shifted  X_fixed
9.5             1     NA         1
1               1     1          1
-0.5            1     1          1
-1              0     1          0
-0.5            0     0          0
0               1     0          0
0               1     1          0
3               1     1          1
0               0     1          1
1               1     0          1  

1 Ответ

2 голосов
/ 21 января 2020

Вам не нужно X_shifted, вы можете использовать lag, что дает вам предыдущее значение

library(dplyr)
df %>% mutate(x_fixed = ifelse(temp.change == 0, lag(X), X))

Или, если нам нужно X от последнего ненулевого значения temp.change, мы можно использовать:

df %>%
  mutate(X_fixed = replace(X, temp.change == 0,NA)) %>%
  tidyr::fill(X_fixed)

#   temp.change X X_fixed
#1          9.5 1       1
#2          1.0 1       1
#3         -0.5 1       1
#4         -1.0 0       0
#5         -0.5 0       0
#6          0.0 1       0
#7          0.0 1       0
#8          3.0 1       1
#9          0.0 0       1
#10         1.0 1       1

данные

df <- structure(list(temp.change = c(9.5, 1, -0.5, -1, -0.5, 0, 0, 
3, 0, 1), X = c(1L, 1L, 1L, 0L, 0L, 1L, 1L, 1L, 0L, 1L)), 
row.names = c(NA, -10L), class = "data.frame")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...