在R中,如何基于转换表将多个值映射到不同的值?

时间:2019-05-04 18:55:04

标签: r string-substitution

我有很多值的大向量。我还有一张表,显示每个这些值应转换为的值。我知道如何使用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

3 个答案:

答案 0 :(得分:1)

一个选项是data.table join。将“测试”数据集转换为data.table(setDT),然后通过列(“名称”,“原始”)与“转换” on联接,因为这些是不同的名称,因为必须用=指定,然后从{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)]

答案 1 :(得分: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 :(得分:1)

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

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")