2015-10-24 51 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"))