如果然后从SAS到R做多个语句

时间:2016-11-10 17:00:21

标签: r if-statement sas

我是R.的新手。这是我要在R中复制的SAS脚本:

if a=4 or b=4 then do;
  if a=1 or b=1 then news="AB";
  else if a=2 or b=2 then news="BC";
  else news="CD";
  end;
else do;
  if a=1 or b=1 then news="DF";
  else news="GH";
end;

其中:a,b是表/数据的变量(列的名称),而news是我想要创建的新变量。

我无法在R中找到ifelse或其他方法的方法。你能帮助我吗?谢谢!

以下是我对上述脚本第一部分的第一次尝试:

news <- ifelse(a==4 | b==4,
           ifelse(a==1 | b==1, "AB",
              ifelse(a==2 | b==2, "BC", "CD")))

但它没有用。错误显示     &#34; ifelse出错(a == 4 | b == 4,ifelse(a == 1 | b ==:       争论&#34;不&#34;缺少,没有默认&#34;

你知道为什么吗?此外,我不知道如何链接第二部分,从&#34;否则做&#34;对R.我觉得SAS脚本比R更容易理解和写作。

2 个答案:

答案 0 :(得分:1)

这是直接翻译。我并没有简化逻辑。

条件放在()or =&gt; ||和平等测试:==

if(a==4 || b==4){
  if (a==1 || b==1) {
    news="AB"
  } else if (a==2 || b==2){
    news="BC"
  } else {
    news="CD"
  }
} else {
  if (a==1 || b==1){
    news="DF"
  } else {
    news="GH"
  }
}

如果您想使用ifelse(),您最终会遇到几个通常难以阅读的嵌套条件。

答案 1 :(得分:0)

ifelse适用于向量(即,您必须测试向量,输出必须是与输入长度相同的向量),if() {...} else {...}适用于单个条件。没有样本输入(并不是真正了解SAS),我不确定你要追求的是什么。如果ab是单个值,则R Schifini的回答很好。

如果ab是向量,那么您使用ifelse是正确的,并且您的代码对我来说效果很好。我们可以将其扩展为包含最后一个else do语句:

test = expand.grid(a = c(1, 2, 4, 7), b = c(1, 2, 4))
a = test$a
b = test$b
news <- ifelse(a == 4 | b == 4,
               ifelse(a == 1 | b == 1, "AB",
                      ifelse(a == 2 | b == 2, "BC", "CD")),
               ifelse(a == 1 | b == 1, "DF", "GH"))

cbind(test, news)
#    a b news
# 1  1 1   DF
# 2  2 1   DF
# 3  4 1   AB
# 4  7 1   DF
# 5  1 2   DF
# 6  2 2   GH
# 7  4 2   BC
# 8  7 2   GH
# 9  1 4   AB
# 10 2 4   BC
# 11 4 4   CD
# 12 7 4   CD