从R中的lookuptable替换字符串

时间:2018-07-16 15:43:46

标签: r

我有一个带有列表的txt文件:

name
Test_123
run_456
Test_789

我还有一个包含“ ID”并给我一个“盘子”的查找表

ID  plate
123 xxx
456 zzz
789 bbb

很想去这里

Test_xxx
run_zzz
Test_bbb

我当前的代码无法完全正常运行。 我猜得到<NA>是在寻找值,而不是字符串或错误。

非常感谢您的帮助!  B

3 个答案:

答案 0 :(得分:1)

一种tidyverse方法是:

library(tidyverse)

df1 %>%
  separate(name, c("name", "ID"), convert=TRUE) %>%
  left_join(df2, by="ID") %>%
  mutate(new_name = paste(name, plate, sep="_"))

使用:

df1 <- structure(list(name = c("Test_123", "run_456", "Test_789")),
                 .Names = "name", class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(ID = c(123L, 456L, 789L), plate = c("xxx", "zzz", 
                                                          "bbb")), .Names = c("ID", "plate"), class = "data.frame", row.names = c(NA, 
                                                                                                                                  -3L))

请注意:

  • separate(..., convert=TRUE)使用一些试探法将字符转换为整数。您也可以手动执行以下操作:mutate(ID=as.integer(ID))
  • 您可以使用unite()(与separate()相反)代替mutate(new_name = paste(name, plate, sep="_")),这也会删除前面的列

答案 1 :(得分:0)

选项为gsubfn

library(gsubfn)
gsubfn("(\\d+)", setNames(as.list(df2$plate), df2$ID), df1$name)
#[1] "Test_xxx" "run_zzz"  "Test_bbb"

数据

df1 <- structure(list(name = c("Test_123", "run_456", "Test_789")),
  .Names = "name", class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(ID = c(123L, 456L, 789L), plate = c("xxx", "zzz", 
"bbb")), .Names = c("ID", "plate"), class = "data.frame", row.names = c(NA, 
-3L))

答案 2 :(得分:0)

对于基本的R选项,您可以在第一个数据框中添加一个具有确切联接数据的新列:

df1$ID <- sub(".*_(?=[0-9]+)", "", df1$name, perl=TRUE)
df1$start <- sub("_[0-9]+", "", df1$name)

然后,使用merge

result <- merge(df1, df2, by="ID")

最后创建所需的输出列:

result$out <- paste0(result$start, "_", result$plate)
result$out

[1] "Test_xxx" "run_zzz"  "Test_bbb"

数据:

df1 <- data.frame(name=c("Test_123", "run_456", "Test_789"), stringsAsFactors=FALSE)
df2 <- data.frame(ID=c("123", "456", "789"),
                  plate=c("xxx", "zzz", "bbb"), stringsAsFactors=FALSE)

Demo