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
矢量化形式if是ifelse:
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测试.您应该将if其switch视为控制流语句,而不是数据转换运算符.您可以使用它们来控制算法的执行,例如测试收敛或选择要执行的执行路径.在大多数情况下,您不会使用它们直接操作数据.
我发现这种方法最易读:
# 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为使用它。