R重新编码数据表中的字符列

时间:2018-06-21 22:35:03

标签: r data.table

我在数据表中有一列,其中包含变量名称。列名称为nutrient。为了便于显示,我想在此列中将变量名称(如“ vit_c_mg”)替换为“维生素C”。我有一个新旧变量的列表。我可以做类似的事情

for (i in 1:length(list1){
    DT[nutrient %in% list1[i], nutrient := list2[i]]
}

,但是必须有更好的data.table方法。

2 个答案:

答案 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-的答案还可以,但我选择了其他方法。 list1dt中唯一的一组通用名称。 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]