我有一个映射到一组类别的变量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中有这样的东西吗?
非常感谢
答案 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) ]
}