根据条件突变新变量

时间:2020-08-27 11:12:27

标签: r purrr mutate

我正在尝试对列表中的新变量进行突变。我得到了两个名为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

有人可以帮我吗? 谢谢!

3 个答案:

答案 0 :(得分:1)

我认为您想得太多了。如果只有二进制值,则可以使用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 :(得分: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 & 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 & rci_imp_post == 0, rci.1 := 0]

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

ifelse(x$rci_det_post == 0 & rci_imp_post == 0, 0)

答案 2 :(得分:1)

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

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