如何从另一个data.table重命名R data.table中的级别?

时间:2015-10-24 05:05:12

标签: r data.table

我有两个data.tables,dt是一个长整数列levels在1 ... 5范围内,另一个data.table“labels”包含一个简单的标签形式是这样的:

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方式?

2 个答案:

答案 0 :(得分:5)

最简单的方法是加入 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 data.table 作为查找表:

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"))

答案 1 :(得分:3)

假设您的数据集是这样生成的:

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

然后你可以&#34;重新标记&#34;使用dt函数的factor级别:

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

如果您的心智等级不属于factor类型,则可以跳过as.character并执行以下操作:

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