R

时间:2016-05-06 00:27:18

标签: r

我正在尝试根据4-6个其他分类变量的值组合创建分类变量。这些组合没有数学逻辑,它非常“我在E之前,除了C之后”类型的东西。

在SAS中,我会这样做(调用原始变量A-F和新变量newvar):

if A=1 and F=2 then newvar = 1;
else if A=2 and B=5 then newvar = 2;
else if B=3 and D=2 then newvar = 3;
else if A=7 and C=2 and F = 1 then newvar = 4;
(several more lines like that)
else newvar=0;

上面示例中的重要事项是能够按顺序级联条件列表,直到满足条件,然后停止并不评估任何其他条件。例如,“B = 3和D = 2”仅在已经满足其他标准的情况下才重要。

但是在R中,似乎没有办法在执行变量赋值时将一大堆其他ifs放在一起,因为它是使用子集运算符完成的。所以相反,我发现自己必须以相反的顺序编写规则,以便更高优先级的规则在后面的顺序中应用并覆盖前面规则所做的事情:

data$newvar <- 0
(a bunch of other lines with conditions)
data$newvar[A == 7 & C == 2 & F == 1] <- 4
data$newvar[B == 3 & D == 2] <- 3
data$newvar[A == 2 & B == 5] <- 2
data$newvar[A == 1 & F == 2] <- 1

虽然有效,但似乎效率低下且杂乱无章,因为与在SAS中重复使用“else if”和“else”不同,此处每个条件都会被评估,并且newvar可能会在达到其最终值之前被覆盖几次。

我对R很新,并且还没有完全理解“apply”系列函数 - 是否有某种方法我可以编写一个实现我的规则的函数,使用R的if / else if / else,然后将()应用于数据框中的所有行?或者其他一些方法来做这个比上面的示例代码更好?

(我尝试过的其他事情:“ifelse”软件包,以及“car”软件包中的“recode”函数。这些软件似乎都不能同时处理多个变量和多个条件。)< / p>

2 个答案:

答案 0 :(得分:3)

考虑如何使用嵌套的if语句在Excel中执行此操作。

data$newvar <- NA #i like to populate with null first so I can check logic later
data$newvar <- ifelse(data$A == 2 & data$F == 2 , 1, 
ifelse(data$A == 2 & data$B == 5, 2, 
ifelse(data$B == 3 & data$D == 2, 3, 
ifelse(data$A == 7 & data$C == 2 & data$F == 1, 4, 0))))

答案 1 :(得分:2)

您可以使用布尔数学:

data$newvar <- with(data, 
          (A == 7 & C == 2 & F == 1)* 4 +
          (B == 3 & D == 2)* 3 +
          (A == 2 & B == 5)* 2 +
          (A == 1 & F == 2)* 1
                    )

这不提供除0之外的任何其他默认值,但由于这是您选择的默认值,所以一切都很好。此变体应提供最高匹配而无需“添加”。

data$newvar <- with(data, pmax( 
      (A == 7 & C == 2 & F == 1)* 4,
      (B == 3 & D == 2)* 3,
      (A == 2 & B == 5)* 2,
      (A == 1 & F == 2)* 1,
       0  )      )