ifelse()中的多个变量分配

时间:2018-09-20 15:23:27

标签: r if-statement

我在这里犯了什么错误?如果其中三个语句中的任何一个为真,我都试图为ab分配一些值。我正在尝试使用ifelse语句:

ifelse(1==1||2==2||3==3, (a<-100,b<-100), (a<-1000,b<-1000)) 

但是我得到一个错误:

  

错误:“ ifelse(1 == 1 || 2 == 2 || 3 == 3,(a <-100,“

编辑:

按照更一般的方式,有两个变量a和b需要根据条件分配不同的值:if(x ==“ cat”或x ==“ dog”或x ==“ horse”,那么a是100,b是200,否则a是500,b是1000)

3 个答案:

答案 0 :(得分:1)

两条评论:

  • ||是短路逻辑或,它不是矢量化的,只会使用第一个元素。如果您在此处使用了变量,则应该得到警告。
  • ifelse是一个函数,而不是流控制,因此您应该将其值分配给变量,而不要尝试在函数参数中进行分配。

所以我认为您真正想要的是:

a <- b <- ifelse(1 == 1 | 2 == 2 | 3 == 3, 100, 1000)

答案 1 :(得分:1)

您可以将R中的var manager = new ApplicationUserManager(userStore, new EmailService()); 视为对3个向量进行运算的函数:

    布尔值的
  1. 向量(真,假)。这是ifelse()部分。
  2. 第一个向量为TRUE时将选择的元素的
  3. 向量。这是1==3 | 2==2 | 3==3部分。
  4. 第一个向量为FALSE时将选择的元素的
  5. 个向量。这是a <- 100部分。

所有3个向量的长度都应相同。

这是一个快速演示:

a <- 1000

vec1 <- 1:10 > 3 & 1:10 < 7 > vec1 [1] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE FALSE vec2 <- LETTERS[1:10] > vec2 [1] "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" vec3 <- letters[1:10] > vec3 [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" 函数将ifelse()vec2组合成一个新的向量,其中根据{的值,从vec3vec2中提取元素{1}}。

vec3

要更好地了解其工作原理,请使用表格形式的所有内容(由@Gregor建议)。

vec1

您尝试的方法的问题在于ifelse(vec1, vec2, vec3) [1] "a" "b" "c" "D" "E" "F" "g" "h" "i" "j" 被误解了。您尝试分配值,而不是向> rbind(vec1, vec2, vec3, result=ifelse(vec1, vec2, vec3)) [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] vec1 "FALSE" "FALSE" "FALSE" "TRUE" "TRUE" "TRUE" "FALSE" "FALSE" "FALSE" "FALSE" vec2 "A" "B" "C" "D" "E" "F" "G" "H" "I" "J" vec3 "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" result "a" "b" "c" "D" "E" "F" "g" "h" "i" "j" 函数提供第二和第三向量。

在您的情况下,仍使用ifelse()的解决方案将执行两次:

ifelse()

注意:在上面的示例中,提供了单个值ifelse()而不是向量。但是R将扩展它的长度以匹配第一个向量的长度。因此,单个值是可以接受的,但可以在后台扩展为向量。

答案 2 :(得分:1)

回答OP在评论中很好地陈述的问题:

  

如果(x ==“ cat”或x ==“ dog”或x ==“ horse”,那么a为100,b为200,否则a为500而b为1000)

'['

使用if (x == "cat" || x == "dog" || x == "horse") { a = 100 b = 200 } else { a = 500 b = 1000 } 代替%in%可以做得更好-效果很好,尤其是当您需要检查更多的值时

|

if (x %in% c("cat", "dog", "horse")) { a = 100 b = 200 } else { a = 500 b = 1000 } 是返回向量的向量化函数。如果要“执行”操作,或为每个测试条件返回一个以上的值,则ifelse是合适的。