2012-01-25 18 views
1

単純なif文を使用してコードをグループにグループ化したいとします。変数には数値コードがあり、複数の数値コードをまとめてグループ化する新しい変数を作成したいと考えています。私は次のif文を書いていますが、多くのコード番号(30コード)であるため、30+のif文を記述するのではなく、変数をグループ化するより洗練されたコードを書くのに助けが必要です。R内のifステートメントを使用して変数をグループ化する

Data2$RevisedSIC.Group <-c() 
for (i in 1:length(Data2$SIC.Group)) { 
if (Data2$SIC.Group[i] =="10110") Data2$RevisedSIC.Group [i]="Metal" else 
if (Data2$SIC.Group[i] =="10410") Data2$RevisedSIC.Group [i]="Metal" else 
if (Data2$SIC.Group[i] =="10439") Data2$RevisedSIC.Group [i]="Metal" else 
if (Data2$SIC.Group[i] =="14111") Data2$RevisedSIC.Group [i]="Stone" else 
if (Data2$SIC.Group[i] =="10421") Data2$RevisedSIC.Group [i]="Stone" } 

答えて

1

Tを見てみましょうループの必要はありません

Data2 <-data.frame(rep(c(10110,10410,10439,14111),2)) 
colnames(Data2) <-"SIC.Group" 

Data2$RevisedSIC.Group[Data2$SIC.Group %in% c(10110,10410,10439)] <- "Metal" 
Data2$RevisedSIC.Group[Data2$SIC.Group %in% 14111] <- "Stone" 

    SIC.Group RevisedSIC.Group 
1  10110   Metal 
2  10410   Metal 
3  10439   Metal 
4  14111   Stone 
5  10110   Metal 
6  10410   Metal 
7  10439   Metal 
8  14111   Stone 
0

あなたは%in%を使用することができます。

metals <- c("10110","10410","10439") 
stones <- c("14111","10421") 
# ... and so on for each group 

if (Data2$SIC.Group[i] %in% metals) { 
    Data2$SIC.Group[i] <- "Metal" 
} else if (Data2$SIC.Group[i] %in% stones) { 
    Data2$SIC.Group[i] <- "Stone" 

} ように#...と、各グループ

のためにあなたはまだ/他の場合と同じ数を記述する必要があると思いますあなたが持っているコードの数よりはるかに少ないグループです。さらに凝縮するに

metals <- c("10110","10410","10439") 
stones <- c("14111","10421") 
# ... and so on for each group 

Data2$SIC.Group[ Data2$SIC.Group %in% metals ] <- "Metal" 
Data2$SIC.Group[ Data2$SIC.Group %in% stones ] <- "Stone" 
# ... and so on for each group 

、あなたは以下のようにリストに自分のグループを定義してからちょうど内のすべてのグループのためのコードの1行を持つことができます:あなたはループで済ますことができ、さらにそれを凝縮する

割り当てるステップ:

groupCodes <- list(
    metals=c("10110","10410","10439"), 
    stones=c("14111","10421") 
    # ... and so on for each group 
) 

for (n in names(groupCodes)) { 
    # just once for all groups. 
    Data2$SIC.Group[ Data2$SIC.Group %in% groupCodes[[n]] ] <- n 
} 
1

match

lookup <- data.frame(code=c('10110','10410','10439','14111','10421'), name=c('Metal','Metal','Metal','Stone','Stone')) 

Data2$RevisedSIC.Group <- lookup$name[match(Data2$SIC.Group,lookup$code)] 
+0

あなたの時間と回答の皆様、ありがとうございます! – Amateur

関連する問題