#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.