![](/img/trans.png)
[英]How do I merge two columns from two datasets in r and include all the elements from one data frame except when they are NA?
[英]R: How do I merge two datasets by partially matching their columns?
我有兩個不同的數據集,如下所示:
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,153,7|8|15|10|3|9|13|14|97|707,17478,14|13|12|11|10|9|8|7|6|5|4,290)
f4 <- c("AA","BB","DD","AA","CC","NN")
city2 <- c("MANCHESTER","PARIS","ROME","BARCELONA","LISBON","AMSTERDAM")
f1.2 <- c(11,4,5,8,34,20)
f2.2 <- c(100,153,346,500,44,290)
f3.2 <- c(4,153,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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.