【问题标题】:R recode a character column in a data tableR重新编码数据表中的字符列
【发布时间】:2018-06-21 22:35:02
【问题描述】:

我在数据表中有一个包含变量名称的列。列名是nutrient。出于显示目的,我想将此列中的变量名称替换为“vit_c_mg”为“Vitamin C”。我有一个新旧变量的列表。我可以做类似的事情

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

但必须有更好的 data.table 方式来执行此操作。

【问题讨论】:

  • 贴一个小例子。您应该明确翻译表是否涵盖DT$nutrient中的所有值。

标签: r data.table


【解决方案1】:

我碰巧有一个名为 dt 的小 dta.table

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。 (在丢弃旧值之前创建新列可能更安全。)

【讨论】:

    【解决方案2】:

    @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]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多