3

我有一个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中有这样的东西吗?

非常感谢

4

3 回答 3

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))

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

names(L)[ Position(function(x) i %in% x, L) ]
于 2013-06-01T18:11:15.187 回答
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 
于 2013-06-01T17:58:23.980 回答
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) ]
}
于 2013-06-01T18:01:36.400 回答