在R中使用switch()来替换矢量值

tor*_*art 20 string replace r switch-statement

这应该是非常简单的,但即使在检查了所有文档和在线示例后,我也没有得到它.

我想使用switch()来替换字符向量的值.

一个假的,极其简单,可重复的例子:

test<-c("He is", "She has", "He has", "She is")
Run Code Online (Sandbox Code Playgroud)

假设我想将"1"包括动词"to be"和"2"分配给句子,包括动词"to have".以下不起作用:

test<-switch(test,
                "He is"=1,
                "She is"=1,
                "He has"=2,
                "She has"=2)
Run Code Online (Sandbox Code Playgroud)

错误信息:

+ + + + Error in switch(test, `He is` = 1, `She is` = 1, `He has` = 2, `She has` = 2) : 
  EXPR must be a length 1 vector
Run Code Online (Sandbox Code Playgroud)

我认为EXPR确实是长度为1的向量,所以有什么不对?

我认为可能是R期望的字符作为替换,但是既没有将switch()包装成"as.integer"也没有包含以下工作:

test<-switch(test,
                "He is"="1",
                "She is"="1",
                "He has"="2",
                "She has"="2")
Run Code Online (Sandbox Code Playgroud)

也许它没有矢量化,我应该做一个循环?是吗?考虑到R的强度是矢量化,会令人失望.提前致谢!

Dav*_*yan 23

这是矢量化函数的正确方法,例如switch:

# Data vector:
test <- c("He is",
          "She has",
          "He has",
          "She is")

# Vectorized SWITCH:
foo <- Vectorize(vectorize.args = "a",
                 FUN = function(a) {
                   switch(as.character(a),
                          "He is" = 1,
                          "She is" = 1,
                          "He has" = 2,
                          2)})

# Result:
foo(a = test)

  He is She has  He has  She is 
      1       2       2       1
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.


RHe*_*tel 13

你试试吧

test_out <- sapply(seq_along(test), function(x) switch(test[x],
  "He is"=1,
  "She is"=1,
  "He has"=2,
  "She has"=2))
Run Code Online (Sandbox Code Playgroud)

或者等价

test_out <- sapply(test, switch,
  "He is"=1,
  "She is"=1,
  "He has"=2,
  "She has"=2)
Run Code Online (Sandbox Code Playgroud)


Hon*_*Ooi 12

矢量化形式ififelse:

test <- ifelse(test == "He is", 1,
        ifelse(test == "She is", 1,
        ifelse(test == "He has", 2,
        2)))
Run Code Online (Sandbox Code Playgroud)

要么

test <- ifelse(test %in% c("He is", "She is"), 1, 2)
Run Code Online (Sandbox Code Playgroud)

switch基本上是写嵌套的方式if- else测试.您应该将ifswitch视为控制流语句,而不是数据转换运算符.您可以使用它们来控制算法的执行,例如测试收敛或选择要执行的执行路径.在大多数情况下,您不会使用它们直接操作数据.


Ged*_*rox 9

我发现这种方法最易读:

# input
test <-c("He is", "She has", "He has", "She is", "Unknown", "She is")

# mapping
map <- c(
  "He is" = 1, 
  "She has" = 2, 
  "He has" = 2, 
  "She is" = 1)

answer <- map[test]

# output
answer
He is She has  He has  She is    <NA>  She is 
    1       2       2       1      NA       1 
Run Code Online (Sandbox Code Playgroud)

如果test是数字,必须将值转换character为使用它。