gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 06:54:55 24 4
gpt4 key购买 nike

我有两个 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))

如何一次性用 labels 中的字符标签替换 dt 中的级别列?

我可以在手动循环中执行此操作(丑陋!),或者我可以通过添加另一列来执行此操作,如下所示:

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

然后删除列 level 并重命名 tmp

有没有好的 data.table 方法来做到这一点?

最佳答案

最简单的方法是加入data.tables。为了显示效果,我在 dt 中添加了一个 id 列(见下文)。您可以按如下方式加入 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"))

关于r - 如何从另一个 data.table 重命名 R data.table 中的级别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33314731/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com