我是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更容易理解和写作。答案 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),我不确定你要追求的是什么。如果a
和b
是单个值,则R Schifini的回答很好。
如果a
和b
是向量,那么您使用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