我有一个带有列表的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
答案 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)