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