R中的组switch语句

时间:2013-06-01 17:40:00

标签: r switch-statement

我有一个映射到一组类别的变量i

我希望根据sector的值将变量i设置为匹配类别。

我可以使用一系列if语句执行此操作,如下所示:

    if(i %in% c(7, 14, 21)) {sector = 'mining'} 
    if(i %in% c(28, 35, 42)) {sector = 'manu'} 
    if(i %in% c(49, 56, 63)) {sector = 'othr'} 
    if(i %in% c(70, 77, 84)) {sector = 'all'} 

这似乎应该是一种可用的分组交换机类型结构。 R中有这样的东西吗?

非常感谢

3 个答案:

答案 0 :(得分:7)

试试这个:

L <- list(mining = c(7, 14, 12), 
      manu = c(28, 35, 42), 
      other = c(49, 56, 63), 
      all = c(70, 77, 84))
names(Filter(function(x) i %in% x, L))

更新:关于Ben的评论,这是一个短路版本。 (如果此评论的动机是速度,请注意?Position说:“当前实施未针对性能进行优化。”)

names(L)[ Position(function(x) i %in% x, L) ]

答案 1 :(得分:3)

通常你会使用查找表。

lookup <- data.frame(id = c(7,14,21,28,35,42,49,56,63,70,77,84),
                     sector=rep(c("mining","manu","othr","all"),each=3),
                     stringsAsFactors=FALSE)

#use the lookup data.frame
lookup[lookup$id == 49,"sector"]
#[1] "othr"

merge(data.frame(i=c(14,21,56,84,7)),lookup,by.x="i",by.y="id")
#    i sector
# 1  7 mining
# 2 14 mining
# 3 21 mining
# 4 56   othr
# 5 84    all 

答案 2 :(得分:1)

您可以使用switch()语句。请注意,对于非连续值,您必须使用字符:

getSector <- function(code) {
    sector <- switch(as.character(code),
                     "7" = "mining",
                     "14" = "mining",
                     "21" = "mining",
                     "28" = "manu",
                     "35" = "manu",
                     "42" = "manu",
                     "49" = "othr",
                     "56" = "othr",
                     "63" = "othr",
                     "70" = "all",
                     "77" = "all",
                     "84" = "all")
}

当然,仔细查看您的代码,您可以将它们转换为连续的整数:

getSector2 <- function(code) {
    sector <- switch(ceiling(code/7/3),
                     "mining",
                     "manu",
                     "othr",
                     "all")
}

我们可以将此进一步减少到

getSectors3 <- function(code) {
    sectors <- c("mining", "manu", "othr", "all")
    sectors[ ceiling(code/7/3) ]
}