Группировка переменной с использованием оператора if в R - PullRequest
1 голос
/ 25 января 2012

Я хотел бы сделать простой оператор if для группировки кодов в группы.Переменная имеет числовые коды, и я хотел бы создать новую переменную, которая группирует несколько числовых кодов вместе.Я написал следующее утверждение if, но поскольку они представляют собой много кодовых чисел (30 кодов), мне нужна помощь в написании более элегантного кода для группировки переменной, а не в написании 30+ операторов 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" }

Ответы [ 3 ]

1 голос
/ 25 января 2012

взгляните на 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)]
1 голос
/ 25 января 2012

Нет необходимости в петле

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 голосов
/ 25 января 2012

Вы можете использовать %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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...