2012-01-25 3 views
1

Я хотел бы сделать простой оператор if для групповых кодов в группы. У переменной есть числовые коды, и я хотел бы создать новую переменную, которая объединяет несколько числовых кодов. Я написал следующий оператор if, но потому, что у них много кодовых номеров (30 кодов), мне нужна помощь в написании более элегантного кода для группировки переменной, а не для написания операторов 30+ if.Группировка переменной с использованием оператора if в R

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 

конденсироваться еще дальше, вы можете определить группы в списке, как показано ниже, а затем просто одну строки коды для всех групп шаг назначения:

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

Смежные вопросы