根据条件突变新变量

问题描述

我正在尝试对列表中的新变量进行突变。我得到了两个名为rci_det_post的变量,其编码为1/0,还有一个名为rci_imp_post的变量,其编码也为1/0。我想突变一个新变量,当rci_det_post为1时包含-1,而当rci_imp_post为1时包含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 & x$rci_imp_post == 0,-1,ifelse(x$rci_det_post == 0 & x$rci_imp_pst == 1,1,ifelse(x$rci_det_post == 0 & 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

有人可以帮我吗? 谢谢!

解决方法

我认为您想得太多了。如果只有二进制值,则可以使用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),rci_imp_post = c(0L,1L,0L)),row.names = c("1","2","3","4"),class = "data.frame")
,

除了索托斯的答案

#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 & implist$rci_imp_post == 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 & rci_imp_post == 0,rci.1 := 0]

请注意,在ifelse函数的最后一行中,您仅定义了两个变量都等于0时的值

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

两个变量是否可能同时为1?如果是这样,它将给出这样的行值-1。