(过去两天我一直被这个问题困扰,所以如果它有关于 SO 的答案,请耐心等待。)
我有两个数据框 A 和 B。我想在 Name 列上合并它们。假设 A 有两列 Name 和 Numbers。 A df 的名称列具有值“.tony.x.rds”、“.tom.x.rds”等。
Name Numbers
.tony.x.rds 15.6
.tom.x.rds 14.5
B df 有两列 Name 和 CharR。 B 的名称列具有值“tony.x”、“tom.x”等。
Name ChaR
tony.x ENG
tom.x US
两个 dfs 的 Name 列中的主要元素是“tony”、“tom”等。
我已经尝试了带有各种选项的 gsub,在 A 和 B 数据框的列名称中留下了“tony”、“tom”等。但是当我使用
StoRe<-merge(A,B, all=T)
我 ge A 和 B 的所有行而不是单行。也就是说,每个“a”、“b”等都有两行,它们在 Numbers 和 CharR 列中具有各自的值。例如:
Name Numbers ChaR
tony 15.6 NA
tony NULL ENG
tom 14.5 NA
tom NULL US
它一直让我头疼不已。我请求你帮忙。
最佳答案
一种可能的解决方案。我不完全确定您想对字符串中的“x”做什么,我将它们保存在链接键中,但是通过将 \\1\\2
更改为 \\1
,您只保留了第一个字母。
a <- data.frame(
Name = paste0(".", c("tony", "tom", "foo", "bar", "foobar"), ".x.rds"),
Numbers = rnorm(5)
)
b <- data.frame(
Name = paste0(c("tony", "tom", "bar", "foobar", "company"), ".x"),
ChaR = LETTERS[11:15]
)
# String consists of 'point letter1 point letter2 point rds'; replace by
# 'letter1 letter2'
a$Name_stand <- gsub("^\\.([a-z]+)\\.([a-z]+)\\.rds$", "\\1\\2", a$Name)
# String consists of 'letter1 point letter2'; replace by 'letter1 letter2'
b$Name_stand <- gsub("^([a-z]+)\\.([a-z]+)$", "\\1\\2", b$Name)
result <- merge(a, b, all = TRUE, by = "Name_stand")
输出:
#> result
# Name_stand Name.x Numbers Name.y ChaR
#1 barx .bar.x.rds 1.38072696 bar.x M
#2 companyx <NA> NA company.x O
#3 foobarx .foobar.x.rds -1.53076596 foobar.x N
#4 foox .foo.x.rds 1.40829287 <NA> <NA>
#5 tomx .tom.x.rds -0.01204651 tom.x L
#6 tonyx .tony.x.rds 0.34159406 tony.x K
另一个,也许更健壮(对于仍将链接的字符串的变体,例如 'tom.rds' 和 'tom';这当然也可能是一个缺点)/
# Remove the rds from a$Name
a$Name_stand <- gsub("rds$" , "", a$Name)
# Remove all non alpha numeric characters from the strings
a$Name_stand <- gsub("[^[:alnum:]]", "", a$Name_stand)
b$Name_stand <- gsub("[^[:alnum:]]", "", b$Name)
result2 <- merge(a, b, all = TRUE, by = "Name_stand")
关于r - 将两个数据框与字符串中具有特定模式的列合并,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40253821/