【问题标题】:In R, how do I map multiple values to different values based on a conversion table?在 R 中,如何根据转换表将多个值映射到不同的值?
【发布时间】:2019-05-04 18:55:04
【问题描述】:

我有一个包含许多值的大向量。我还有一个表格,显示了这些值中的每一个应转换为什么。我知道如何使用 gsub 一次对向量的一个值执行此操作,但我不确定如何同时对所有值执行此操作。本质上,我想获取一个向量,引用一个数据表来确定该向量的每个项目应该转换为什么,然后进行转换。

例子:

test <- data.frame(Name = c(rep("TestA", 3), rep("TestB", 4), rep("TestC", 2)))
conversion <- data.table(Original = c("TestA", "TestB", "TestC"), New = c("380", "JK", "LOL"))

test
   Name
1 TestA
2 TestA
3 TestA
4 TestB
5 TestB
6 TestB
7 TestB
8 TestC
9 TestC

conversion
   Original New
1:    TestA 380
2:    TestB  JK
3:    TestC LOL

我想要什么:

   Name NewName
1 TestA     380
2 TestA     380
3 TestA     380
4 TestB      JK
5 TestB      JK
6 TestB      JK
7 TestB      JK
8 TestC     LOL
9 TestC     LOL

【问题讨论】:

  • 只需合并或加入两者。

标签: r string-substitution


【解决方案1】:

我建议tidyverse,它使用自然语言。

test <- tibble(Name = c(rep("TestA", 3), rep("TestB", 4), rep("TestC", 2)))
conversion <- tibble(Original = c("TestA", "TestB", "TestC"), New = c("380", "JK", "LOL"))

test %>% 
  left_join(conversion, by = c("Name" = "Original"))

【讨论】:

    【解决方案2】:

    一个选项是data.tablejoin。将“测试”数据集转换为 data.table (setDT),然后通过列 (“名称”、“原始”) 与“转换”on 连接 - 因为它们是不同的名称,因为必须使用 @987654325 指定@),分配 (:=) 来自 'conversion' 的 'New' 以在 'test' 中创建 'NewName' 列。如果没有匹配的元素,则为NA

    library(data.table)
    setDT(test)[conversion, NewName := New, on = .(Name = Original)]
    test
    #    Name NewName
    #1: TestA     380
    #2: TestA     380
    #3: TestA     380
    #4: TestB      JK
    #5: TestB      JK
    #6: TestB      JK
    #7: TestB      JK
    #8: TestC     LOL
    #9: TestC     LOL
    

    或者不使用任何包

    test$NewName <- conversion$New[match(test$Name, conversion$Original)]
    

    【讨论】:

    • 您介意解释一下这是如何工作的吗?令我困惑的部分是参数都在括号中,而不是在实际的函数调用中,所以虽然它有效,但我并不真正了解它的工作结构。
    【解决方案3】:

    您实际上并不需要任何花哨的东西:只需矢量索引。从您的代码开始

    test <- data.frame(Name = c(rep("TestA", 3), rep("TestB", 4), rep("TestC", 2)))
    conversion <- data.table(Original = c("TestA", "TestB", "TestC"), New = c("380", "JK", "LOL"))
    

    将转换data.table改为向量:

    vec <- conversion$New
    names(vec) <- conversion$Original
    vec
    # TestA TestB TestC 
    # "380"  "JK" "LOL" 
    

    然后通过索引添加一个新列:

    test$NewName <- vec[test$Name]
    

    顺便说一句,如果你的转换表是手动输入的,你可以直接创建vec

    vec <- c(TestA = "380", TestB = "JK", TestC = "LOL")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-26
      • 2017-09-21
      • 2016-05-21
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2017-08-24
      • 2022-11-16
      相关资源
      最近更新 更多