我在数据表中有一列,其中包含变量名称。列名称为nutrient
。为了便于显示,我想在此列中将变量名称(如“ vit_c_mg”)替换为“维生素C”。我有一个新旧变量的列表。我可以做类似的事情
for (i in 1:length(list1){
DT[nutrient %in% list1[i], nutrient := list2[i]]
}
,但是必须有更好的data.table方法。
答案 0 :(得分:4)
我碰巧有一个名为dt的小dta表。
dt
x y z d1 d2
1: 1 1 b 0.948027912 1
2: 2 2 a 0.926351588 1
3: 4 1 a 0.555704929 1
4: 4 1 a 0.987548561 1
5: 2 1 a 0.093421508 1
使用现有的列值为翻译表建立索引非常简单:
dt[ , z := c(a="v",b="w")[z] ]
> dt
x y z d1 d2
1: 1 1 w 0.948027912 1
2: 2 2 v 0.926351588 1
3: 4 1 v 0.555704929 1
4: 4 1 v 0.987548561 1
5: 2 1 v 0.093421508 1
nutrient
的值应与转换向量中的名称匹配。向量中列中的每个当前值都需要有一个名称,否则您将获得NA。 (在丢弃旧值之前创建新列可能更安全。)
答案 1 :(得分:0)
@ 42-的答案还可以,但我选择了其他方法。 list1
是dt
中唯一的一组通用名称。 list2
是转换后的名称。 dt.temp
本质上是一个查找表。
dt.temp <- data.table(list1 = list1, list2 = list2]
dt <- merge(dt, dt.table, by.x = "nutrient", by.y = "list1")
dt[, nutrient:= NULL]
setnames(DT, old = "list2", new = "nutrient]