用相同的符号合并data.frame中的列

时间:2018-11-01 18:54:02

标签: r split-apply-combine

我想通过文本中的相同符号合并data.frame的列表。这是我的数据:

d1 <- data.frame(Name = c("aaa", "bbb", "ccc","ddd","ggg", "eee"), ID = c("123", "456", "789", "101112", "131415", "161718"), stringsAsFactors = FALSE)

d2 <- data.frame(Code = c("123.aR16", "456d245", "14asadf789", "123_dy6r", "202122-fsd", "101112gh"), CupCake = c("a1", "a2", "a3", "a4", "a5", "a6"), stringsAsFactors = FALSE)

如果代码包含来自 ID 的数字的相同组合->使用来自名称的数据添加新值。

它看起来像是来自名称的复制粘贴值。

预期输出:

  Name     ID       Code CupCake
1  aaa    123   123.aR16      a1
2  bbb    456    456d245      a2
3  ccc    789 14asadf789      a3
4  aaa    123   123_dy6r      a4
5   NA     NA 202122-fsd      a5
6  ddd 101112   101112gh      a6

2 个答案:

答案 0 :(得分:1)

使用tidyverse包:

library(dplyr)
library(stringr)

# Create ID in d2
d2 <- mutate(d2, ID = str_extract(Code, "([0-9]+)"))

# Merge d1 and d2 based on ID
df <- full_join(d1, d2, by= "ID")

# Edit: if you only want one row per ID
df1 <- inner_join(d1, d2, by= "ID")

# Or
df2 <- inner_join(d2, d1, by= "ID")

答案 1 :(得分:0)

另一种解决方案。

d2$ID=NA

for(id in d1$ID)
     d2$ID[grep(id, d2[,1])]=id
# if you want to see all data
dplyr::full_join(d1,d2,by="ID")
# if only interested in matched
dplyr::inner_join(d1,d2,by="ID")