我有两个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方式?
答案 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)]