如何通过比较其他两个变量来创建新变量

时间:2019-05-09 00:47:05

标签: r

我必须根据其他两个变量中存在的值创建一个名为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:这里的新手,不知道如何以表格形式编写,抱歉。...

2 个答案:

答案 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)

您可以将floorbetweencase_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后面添加))。这种方法的好处是代码的可读性。