2012-01-25 3 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 

당신은 아래의 목록에서 그룹을 정의하고 그냥 모든 그룹에 대한 한 줄의 코드를 가질 수있다, 더욱 응축 :

당신은 루프를 생략 할 수 그것을 더 응축 할당 단계 :

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

관련 문제