我想使用switch语句来转换数字。如果案例为1,则数字应为13,案例2应为14等...
因此我写了以下声明:
settime <- function(time){
switch(time,
"1" = 13,
2 = 14,
3 = 15,
4 = 16,
5 = 17,
6 = 18,
7 = 19,
8 = 20,
9 = 21,
10 = 22,
11 = 23,
12 = 24)
}
然而,这给了我以下错误:
错误:意外'='在:“切换(时间, 1 =“
想到我哪里出错了?
答案 0 :(得分:3)
获得所需内容的更明显方法是使用time + 12
。
它比switch
更简单,允许您传递矢量而不仅仅是值。
但是因为你的问题可能比你在你的例子中放置的问题更复杂,如果你觉得你需要使用switch(你一次只能传递一个值),并完成我的评论,你有2个选项可以执行此操作,如以下help(switch)
示例中所述:
开关以两种不同的方式工作,具体取决于第一个参数 计算为字符串或数字。
如果EXPR的值不是字符串,则强制转换为 整数。请注意,这也适用于因素,并带有警告 通常是字符级别。如果整数介于1之间 和nargs() - 1然后评估和...的相应元素 结果返回:因此,如果第一个参数是3,那么第四个参数 参数被评估并返回。
如果EXPR评估为字符串,则匹配该字符串 (确切地)到......中的元素的名称。如果有匹配 然后评估该元素,除非它被遗漏,在这种情况下 评估下一个非缺失元素,例如switch(“cc”,a = 1,cc =,cd =,d = 2)评估为2.如果有多个匹配, 使用第一个匹配元素。在没有匹配的情况下,如果有 是一个未命名的元素......它的值被返回。 (如果还有更多 一个这样的参数会返回一个错误。)
任何时间都是一个字符变量:
time <- "3"
switch(time, "1"=13, "2"=14, "3"=15, "4"=16)
# [1] 15
或时间是数字:
time <- 3
switch(time, 13, 14, 15, 16)
# [1] 15
答案 1 :(得分:2)
我们可以在不使用任何switch
的情况下执行此操作。我不确定大型向量的效率switch
。但是,下面的方法应该足够快。
res <- setNames(13:24, 1:12)[as.character(v1)]
res
#4 3 9 7 8 12 4 10 10 4 8 5 9 9 4 11 3 1 7 2 2 7 9 2 3 9
#16 15 21 19 20 24 16 22 22 16 20 17 21 21 16 23 15 13 19 14 14 19 21 14 15 21
从上面可以更容易地删除name
。
unname(res)
或者
as.vector(res)
我们不需要使用as.character
,因为元素从1:12开始。但是,如果它是一个不同的向量,那么我们可能需要格外小心。
set.seed(24)
v1 <- sample(1:12, 30, replace=TRUE)