2014-09-13 130 views
1

我需要將當前按字母順序排列的數字標識符更改爲數字。我已經創建,其中每個字母標識符與數從另一個數據幀中的值中替換一個數據幀中的值

individuals num.individuals (g4) 
1   ZYO    64 
2   KAO    24 
3   MKU    32 
4   SAG    42 

我需要在我的主數據幀(G3)和類似的明智的所有其它代碼用數字64來替換ZYO相關聯的數據幀。

我主要的數據幀(G3)看起來像這樣

SAG YOG GOG BES ATR ALI COC CEL DUN EVA END GAR HAR HUX ISH INO JUL 
1     2             
2     2     EVA        
3 SAG    2     EVA        
4     2             
5 SAG    2             
6     2 

現在小規模的,我可以寫代碼來改變它就像我與ATR

g3$ATR <- as.character(g3$ATR) 
g3[g3$target == "ATR" | g3$ATR == "ATR","ATR"] <- 2 

做但這是時間消耗和增加人爲錯誤的可能性。

我知道有辦法爲NAS

我想,也許我們可以for循環此做一做這在大規模,但我不夠好寫一個自己。

我也一直在嘗試使用此功能,我感覺好像可以工作,但我不知道如何在邏輯上建立這樣的說法,它被張貼在提問董事會這裏 Fast replacing values in dataframe in R

df <- as.data.frame(lapply(df, function(x){replace(x, x <0,0)}) 

我有試圖通過

df <- as.data.frame(lapply(g4, function(g3){replace(x, x <0,0)}) 

回答

1

下面是使用data.table包一個做法我的工作數據到這一點:

首先,創建類似數據重複的例子:

require(data.table) 
ref <- data.table(individuals=1:4,num.individuals=c("ZYO","KAO","MKU","SAG"),g4=c(64,24,32,42)) 
g3 <- data.table(SAG=c("","SAG","","SAG"),KAO=c("KAO","KAO","","")) 

這裏是ref表:

individuals num.individuals g4 
1:   1    ZYO 64 
2:   2    KAO 24 
3:   3    MKU 32 
4:   4    SAG 42 

,這是你g3表:

SAG KAO 
1:  KAO 
2: SAG KAO 
3:   
4: SAG  

現在我們做的我們查找並替換:

g3[ , lapply(.SD,function(x) ref$g4[chmatch(x,ref$num.individuals)])] 

而最終的結果:

SAG KAO 
1: NA 24 
2: 42 24 
3: NA NA 
4: 42 NA 

如果你需要更多的速度,fastmatch包可能與他們的fmatch功能幫助:

require(fastmatch) 
g3[ , lapply(.SD,function(x) ref$g4[fmatch(x,ref$num.individuals)])] 

    SAG KAO 
1: NA 24 
2: 42 24 
3: NA NA 
4: 42 NA 
相關問題