Изменить новую переменную по условию

#r #purrr #dplyr

#r #мурлыканье #dplyr

Вопрос:

Я пытаюсь изменить новую переменную внутри списка. Я получил две переменные с именем rci_det_post, закодированные с помощью 1/0, и переменную с именем rci_imp_post, закодированную также как 1/0. Я хочу изменить новую переменную, которая содержит -1, когда rci_det_post равен 1, и 1, когда rci_imp_post равен 1. Если оба значения равны 0, оно должно содержать 0.

Вот пример того, как я хочу, чтобы это тоже выглядело:

       rci_det_post  rci_imp_post rci.1
1           1           0          -1                                                  
2           0           0           0                                                  
3           0           1           1                                       
4           0           0           0    
  

Итак, я попробовал это:

 implist %>%
  map(function(x) mutate(x, rci.1 = ifelse(x$rci_det_post == 1 amp; x$rci_imp_post == 0, -1,
                                           ifelse(x$rci_det_post == 0 amp; x$rci_imp_pst == 1, 1,
                                                  ifelse(x$rci_det_post == 0 amp; rci_imp_post == 0, 0)))))
             
  

Но, к сожалению, это не работает, потому что я получаю это взамен:

       rci_det_post  rci_imp_post rci.1
1           1           0          -1                                                  
2           0           0           NA                                                  
3           0           1           NA                                       
4           0           0           NA
  

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

Ответ №1:

В дополнение к ответу Сотоса

 #using ifelse
implist$rci.1 <- ifelse(implist$rci_det_post ==1, -1,
                        ifelse(implist$rci_imp_post == 1, 1,
                               ifelse(implist$rci_det_post == 0 amp; implist$rci_imp_post == 0, 0, implist$rci.1)))

#using data.table
library(data.table)
setDT(implist)
implist[rci_det_post == 1, rci.1 := -1]
implist[rci_imp_post == 1, rci.1 := 1]
implist[rci_det_post ==0 amp; rci_imp_post == 0, rci.1 := 0]
  

Обратите внимание, что в последней строке вашей функции ifelse вы определили, каким должно быть значение, только когда обе переменные равны 0

 ifelse(x$rci_det_post == 0 amp; rci_imp_post == 0, 0)
  

Ответ №2:

Я думаю, вы переоцениваете это. Если у вас есть только двоичные значения, вы можете использовать pmax для получения максимального значения каждой строки. Это будет либо 1, либо 0 (если оба 0). затем вы можете применить условие для изменения всех значений, где rci_det_post равно 1, на -1, т.е.

 replace(do.call(pmax, d1), d1$rci_det_post == 1, -1)
#[1] -1  0  1  0
  

где

 dput(d1)
structure(list(rci_det_post = c(1L, 0L, 0L, 0L), rci_imp_post = c(0L, 
0L, 1L, 0L)), row.names = c("1", "2", "3", "4"), class = "data.frame")
  

Комментарии:

1. Прежде всего, спасибо за ответ. Я думаю, что я не совсем понимаю решение. Проблема в том, что есть также много других переменных, поэтому pmax не работает. Также я не совсем понимаю, что делает вторая часть с d1. Извините, я совсем новичок в этой теме.

2. Если у вас есть другие столбцы, то сделайте это с нужными вам столбцами, т. Е. do.call(pmax, d1[2:3]) Если интересующие столбцы являются вторыми и третьими. Вторая часть (с dput ) предназначена только для того, чтобы сделать пример воспроизводимым, чтобы люди могли просто копировать / вставлять в свой сеанс. Ничего общего с ответом

Ответ №3:

 df %>%
  mutate(rci.1 = case_when(
    rci_det_post == 1 ~ -1,
    rci_imp_post == 1 ~ 1,
    TRUE ~ 0
  )
)
  

Возможно ли, что обе переменные равны 1 одновременно? Если это так, это даст такое значение строки -1.