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