如何解决R:如何通过部分匹配它们的列来合并两个数据集?
我有两个不同的数据集,如下所示:
city1 <- c("LONDON","PARIS","ROME","MADRID","LISBON","AMSTERdam")
f1.1 <- c(11,4,5,3,34,24)
f2.1 <- c(104,153,346,17478,44,290)
f3.1 <- c(0,7|8|15|10|3|9|13|14|97|707,14|13|12|11|10|9|8|7|6|5|4,290)
f4 <- c("AA","BB","DD","AA","CC","NN")
city2 <- c("MANCHESTER","BARCELONA","AMSTERdam")
f1.2 <- c(11,8,20)
f2.2 <- c(100,500,290)
f3.2 <- c(4,15,10200,7,180)
df1
city f1 f2 f3 f4
1 LONDON 11 104 0 AA
2 PARIS 4 153 153 BB
3 ROME 5 346 7|8|15|10|3|9|13|14|97|707 DD
4 MADRID 3 17478 17478 AA
5 LISBON 34 44 14|13|12|11|10|9|8|7|6|5|4 CC
6 AMSTERdam 24 290 290 NN
df2
city2 f1 f2 f3
1 MANCHESTER 11 100 4
2 PARIS 4 153 153
3 ROME 5 346 15
4 BARCELONA 8 500 10200
5 LISBON 34 44 7
6 AMSTERdam 20 290 180
我的目标是获得一个数据集 df3,其中包含这两者之间的匹配数据。
以 df3 结尾的数据需要匹配以下特征:'city'、'f1'、'f2' 和 'f3'。
我设法通过 merge(df1,df2,by=c('city','f1','f2','f3'))
这样做,在这种情况下我获得了
city1 f1 f2 f3 f4
1 PARIS 4 153 153 BB
但是,它没有捕获我在 df1 的“f3”列中有一堆数字的情况。因此,对于“f3”列,我想进行一种部分匹配并获得以下结果:
city f1 f2 f3 f4
1 PARIS 4 153 153 BB
2 ROME 5 346 15 DD
3 LISBON 34 44 7 CC
请注意,原始数据集分别包含 +1M(百万)和 300 行。
解决方法
这里有一种方法,您首先将 df1$f3 列拆分为多行(| = 分隔符),然后执行左连接。
library(splitstackshape)
library(data.table)
# Set to data.table format
setDT(df1); setDT(df2)
# Split column f3 to multiple rows,use | as separator
df1.long <- splitstackshape::cSplit(df1,"f3",sep = "|",direction = "long")
# left join,only keep matched rows
df2[ df1.long,on = .(city2 = city,f1,f2,f3),nomatch = 0L]
# city2 f1 f2 f3 f4
# 1: PARIS 4 153 153 BB
# 2: ROME 5 346 15 DD
# 3: LISBON 34 44 7 CC
使用的样本数据
df1 <- read.table(text=" city f1 f2 f3 f4
LONDON 11 104 0 AA
PARIS 4 153 153 BB
ROME 5 346 7|8|15|10|3|9|13|14|97|707 DD
MADRID 3 17478 17478 AA
LISBON 34 44 14|13|12|11|10|9|8|7|6|5|4 CC
AMSTERDAM 24 290 290 NN",header = TRUE)
df2 <- read.table(text=" city2 f1 f2 f3
MANCHESTER 11 100 4
PARIS 4 153 153
ROME 5 346 15
BARCELONA 8 500 10200
LISBON 34 44 7
AMSTERDAM 20 290 180 ",header = TRUE)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。