我必须根据其他两个变量中存在的值创建一个名为comorbidity的变量,并将其添加到数据框中
现在我有一个名为诊断的数据框,其变量如下所示:
v1 <- c(222,250,255,250.23)
v2 <- c(300,369,400,450)
现在,如果v1不是黑白250-250.99,而v2不是黑白390-490,则新变量0中的值
如果v1是b / w 250-250.99,而v2不是b / w 390-490,则新变量1中的值
如果v1不是黑白250-250.99,而v2是黑白390-490,则新变量2中的值
如果v1是b / w 250-250.99,而v2是b / w 390-490,则新变量3中的值
我尝试过ifelse
并编写了一个巨大的代码,但没有给出令人满意的答案
diabetic_maindf$comorbidity_1_2 <-
if_else((diagnosis$v1 == diagnosis$v2 ),0,
if_else((diagnosis$v1 == 1 | diagnosis$v2 == 0),1,
if_else((diagnosis$v1 == 0 & diagnosis$v2 == 1),1,
我想要具有第3个变量的数据框,如下所示
v1 <- c(222,250,255,250.23)
v2 <- c(300,369,400,450)
new_var <- c(0,1,2,3)
P.S:这里的新手,不知道如何以表格形式编写,抱歉。...
答案 0 :(得分:3)
在interaction
和类似功能存在的情况下,不需要逐步进行此操作:
interaction(v1 >= 250 & v1 <= 250.99, v2 >= 390 & v2 <= 490)
#[1] FALSE.FALSE TRUE.FALSE FALSE.TRUE TRUE.TRUE
#Levels: FALSE.FALSE TRUE.FALSE FALSE.TRUE TRUE.TRUE
c(0,1,2,3)[interaction(v1 >= 250 & v1 <= 250.99, v2 >= 390 & v2 <= 490)]
#[1] 0 1 2 3
这种逻辑的优点是,它将扩展到n
个比较,而只编写n
条语句,而不是2^n
条显式比较。
答案 1 :(得分:2)
您可以将floor
和between
与case_when
结合使用:
v1 <- c(222,250,255,250.23)
v2 <- c(300,369,400,450)
diagnosis <- data.frame(v1=v1, v2=v2)
library(dplyr)
mutate(diagnosis, v3 = case_when(
floor(v1) == 250 & between(v2,390,490) ~ 3,
floor(v1) != 250 & between(v2,390,490) ~ 2,
floor(v1) == 250 & !between(v2,390,490) ~ 1,
floor(v1) != 250 & !between(v2,390,490) ~ 0
))
这将产生:
v1 v2 v3
1 222.00 300 0
2 250.00 369 1
3 255.00 400 2
4 250.23 450 3
如果要将其保存到新的数据框中,只需将--> df
末尾的mutate
后面添加))
。这种方法的好处是代码的可读性。