如何将键索引映射到 R 中具有 key/pair 索引的 data.table 或 data.frame 对象的每个元素?
How can I map a key index into each element of a data.table or data.frame object in R with a key/pair index?
我目前在 R
中有以下 data.table:
tab <- data.table(Col1=c("Grade1","Grade2","Grade2"),Col2=c("Grade3","Grade3","Grade1"),Col3=c("Grade1","Grade2","Grade3"))
> tab
Col1 Col2 Col3
1: Grade1 Grade3 Grade1
2: Grade2 Grade3 Grade2
3: Grade2 Grade1 Grade3
我想根据 index/value table:
映射
kvtab <- data.table(Key=c("Grade1","Grade2","Grade3"),Value=c(1,2,3))
> kvtab
Key Value
1: Grade1 1
2: Grade2 2
3: Grade3 3
这样我就可以得到:
Col1 Col2 Col3
1: 1 3 1
2: 2 3 2
3: 2 1 3
当有多列时,如何在此处创建联接或合并?
与 lapply
和 match
:
tab[,colnames(tab):=lapply(.SD,function(x) kvtab$Value[match(x,kvtab$Key)])][]
Col1 Col2 Col3
1: 1 3 1
2: 2 3 2
3: 2 1 3
重复更新加入
这会将 tab
的每一列与 查找 table kvtab
连接起来,并相应地替换值:
library(data.table)
for (col in colnames(tab)) tab[kvtab, on = sprintf("%s==Key", col), (col) := Value][]
tab
Col1 Col2 Col3
1: 1 3 1
2: 2 3 2
3: 2 1 3
简单的解决方案
仅对给定的示例数据集有效可能对其他用例无效
从每个元素中删除子字符串 Grade
:
tab[, lapply(.SD, function(x) stringr::str_remove(x, "Grade"))]
或者,将每一列转换为一个因子并返回因子水平:
tab[, lapply(.SD, function(x) as.integer(factor(x, levels = kvtab$Key)))]
Col1 Col2 Col3
<int> <int> <int>
1: 1 3 1
2: 2 3 2
3: 2 1 3
请注意,需要 levels
参数以确保所有列共享相同的因子水平。
我目前在 R
中有以下 data.table:
tab <- data.table(Col1=c("Grade1","Grade2","Grade2"),Col2=c("Grade3","Grade3","Grade1"),Col3=c("Grade1","Grade2","Grade3"))
> tab
Col1 Col2 Col3
1: Grade1 Grade3 Grade1
2: Grade2 Grade3 Grade2
3: Grade2 Grade1 Grade3
我想根据 index/value table:
映射kvtab <- data.table(Key=c("Grade1","Grade2","Grade3"),Value=c(1,2,3))
> kvtab
Key Value
1: Grade1 1
2: Grade2 2
3: Grade3 3
这样我就可以得到:
Col1 Col2 Col3
1: 1 3 1
2: 2 3 2
3: 2 1 3
当有多列时,如何在此处创建联接或合并?
与 lapply
和 match
:
tab[,colnames(tab):=lapply(.SD,function(x) kvtab$Value[match(x,kvtab$Key)])][]
Col1 Col2 Col3
1: 1 3 1
2: 2 3 2
3: 2 1 3
重复更新加入
这会将 tab
的每一列与 查找 table kvtab
连接起来,并相应地替换值:
library(data.table)
for (col in colnames(tab)) tab[kvtab, on = sprintf("%s==Key", col), (col) := Value][]
tab
Col1 Col2 Col3 1: 1 3 1 2: 2 3 2 3: 2 1 3
简单的解决方案
仅对给定的示例数据集有效可能对其他用例无效
从每个元素中删除子字符串 Grade
:
tab[, lapply(.SD, function(x) stringr::str_remove(x, "Grade"))]
或者,将每一列转换为一个因子并返回因子水平:
tab[, lapply(.SD, function(x) as.integer(factor(x, levels = kvtab$Key)))]
Col1 Col2 Col3 <int> <int> <int> 1: 1 3 1 2: 2 3 2 3: 2 1 3
请注意,需要 levels
参数以确保所有列共享相同的因子水平。