(过去两天我一直被这个问题困扰,所以如果它有关于 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/

10-15 11:32