Допустим, у меня есть такой фрейм данных со столбцами X, Y, Z, T и более чем 100 строками:

order X Y Z T
 i    a k b n
 j    c a b n

Как видите, если i-th X и j-th Y имеют одинаковое значение (т. Е. a), то i-th Z и j-th Z имеют одинаковое значение ({{X5} }) и i-th T и j-th T имеют одинаковое значение (n)

Я хочу сделать следующее: если i-th X и j-th Y имеют одинаковое значение (т. Е. a), то i-th Z = b и j-th Z = n и i-th T = n , j-th T = b

order  X Y Z T
   i   a k b n
   j   c a n b

Я пробовал сделать это в R, используя цикл if else и for, но не смог.

Может ли кто-нибудь помочь мне сделать это в R?

1
Günal 11 Фев 2021 в 21:15

1 ответ

Лучший ответ

Это можно сделать с помощью case_when

library(dplyr)
df1 <- df1 %>% 
   mutate(Z = case_when(lag(X) == Y~ T, TRUE ~ Z),
          T = case_when(lag(X) == Y ~ lag(Z), TRUE ~ T))

-вывод

df1
#  order X Y Z T
#1     i a k b n
#2     j c a n b

Данные

df1 <- structure(list(order = c("i", "j"), X = c("a", "c"), Y = c("k", 
"a"), Z = c("b", "b"), T = c("n", "n")), class = "data.frame", row.names = c(NA, 
-2L))
1
akrun 11 Фев 2021 в 18:59