2015-10-24 108 views
1

我有兩個data.tables,dt是漫長的,在範圍爲1 ... 5的整數列levels,和另一個data.table「標籤」包含標籤以簡單的形式是這樣的:如何從另一個data.table中重命名R data.table中的級別?

labels <- data.table(V1=1:5, V2=c("Very Low", "Low", "Median", "High", "Very High")) 
# V1  V2 
# 1: 1  Very Low 
# 2: 2  Low 
# 3: 3  Median 
# 4: 4  High 
# 5: 5  Very High 

實際dt是相當大的,但是對於重複性簡單的人會做(儘管在現實DT水平不是常規):

dt <- data.table(levels=rep(1:5, times=10)) 

我怎麼能在dt與字符標籤的替代水平列從labels一個去?

我可以手動循環做到這一點,我也可以通過添加另一列,這樣做(醜陋!):

dt[, tmp := labels$V2[dt$level] ] 

,然後刪除列level和重命名tmp

有沒有一個很好的data.table方法來做到這一點?

+0

@hfty請參閱更新 –

回答

2

假設你的數據集是這樣產生的:

dt <- data.table(levels=rep(1:5, times=10)) 
labels <- data.table(V1=1:5, V2=c("Very Low", "Low", "Median", "High", "Very High")) 

然後你就可以「重新標記」水平的dt使用factor功能:

dt[, level := as.character(factor(level, labels = labels$V2))] 

如果你不介意的水平存在的factor類型,您可以跳過as.character,只需執行以下操作:

dt[, level := factor(level, labels = labels$V2)] 
+0

啊哈!我會盡力的,謝謝 –

4

最簡單的方法是加入data.tables。爲了顯示效果,我添加了id列到dt(見下文)。你可以加入data.tables如下:

dt[labels, on=c("levels"="V1")][order(id)] # the [order(id)] part is not necessary, but added to show the effect better 

這給(第7行):

levels id  V2 
1:  1 1 Very Low 
2:  2 2  Low 
3:  3 3 Median 
4:  4 4  High 
5:  5 5 Very High 
6:  1 6 Very Low 
7:  2 7  Low 
.... 

或者甚至可能更好:

dt <- dt[labels, .(id,levels=V2), on=c("levels"="V1")][order(id)] 

這給(第一7行):

> dt 
    id levels 
1: 1 Very Low 
2: 2  Low 
3: 3 Median 
4: 4  High 
5: 5 Very High 
6: 6 Very Low 
7: 7  Low 
.... 

另一種選擇是使用match函數和labels數據。表查找表:

dt[, levels := labels$V2[match(levels, labels$V1)]] 

這給:

> dt 
     levels id 
1: Very Low 1 
2:  Low 2 
3: Median 3 
4:  High 4 
5: Very High 5 
6: Very Low 6 
7:  Low 7 
.... 

使用的數據:

dt <- data.table(levels=rep(1:5, times=10))[,id:=.I] 
labels <- data.table(V1=1:5, V2=c("Very Low", "Low", "Median", "High", "Very High"))