2017-07-19 76 views
-3

現在,我有數據集包括的變量Gbcodencnty將值分配給一個變量,而不是使用if語句

> str(dt) 
'data.frame': 840 obs. of 8 variables: 
$ Gbcode      : Factor w/ 28 levels "11","12","13",..: 21 22 23 24 25 26 27 28 16 17 ... 
$ ncounty     : num 0 0 0 0 0 0 0 0 0 0 ... 

我想要做以下的事情:

如果數據記錄與Gbcode等於11,然後分配到20其ncnty

Gbcode:11,12,13,14,15,21,22,23,31,32,33
心病響應ncnty:20,19,198,131,112,102,60,145,22,115,95

我想知道是否有更好的解決方案,而不是寫一個if語句,這將有許多行在這種情況下,可能少於20行代碼。

+4

'dt $ ncounty [dt $ Gbcode ==「11」] < - 20' –

+1

有很多這個問題的帖子 dt [dt $ gbcode == 11,「ncnty」] = 20 –

+0

@MattTyers您好馬特,謝謝!這比if語句更好。但是,實際上我有20個獨特的Gbcode,通過使用你的代碼,我需要寫20行代碼。我想知道在這種情況下是否要寫少於20行的代碼。再次感謝! – user129343

回答

2

這是一個merge操作,據我所知。做一個小的查找表與Gbcode/ncnty數據,然後merge

# lookup table 
lkup <- data.frame(Gbcode=c(11,12,13),ncnty=c(20,19,198)) 

#example data 
dt <- data.frame(Gbcode=c(11,13,12,11,13,12,12)) 
dt 
# Gbcode 
#1  11 
#2  13 
#3  12 
#4  11 
#5  13 
#6  12 
#7  12 

合併:

merge(dt, lkup, by="Gbcode", all.x=TRUE) 
# Gbcode ncnty 
#1  11 20 
#2  11 20 
#3  12 19 
#4  12 19 
#5  12 19 
#6  13 198 
#7  13 198 

有時最好使用match對於這樣的事情太:

dt$ncnty <- lkup$ncnty[match(dt$Gbcode,lkup$Gbcode)] 
+0

謝謝!這真的幫助我! – user129343

-1

這可能會更優雅,但應該做的伎倆。

Gbcodes <- as.character(c(11, 12, 13, 14, 15, 21, 22, 23, 31, 32, 33)) 
ncounties <- c(20, 19, 198, 131, 112, 102, 60, 145, 22, 115, 95) 

for(i in 1:length(Gbcodes)) dt$ncounty[dt$Gbcode==Gbcodes[i]] <- dt$ncounties[i]