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 に答える
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 に答える