我有两个数据框。
第一列有两列:x
是水深,y
是每个深度的温度。
第二个也有两列,x
也是水深,但与第一个表相比深度不同。第二列z
是盐度。
我希望x
加入两个表,方法是将z
添加到第一个表中。我已经学会了如何使用tidyr
中的'key'来连接表,但这只有在密钥相同时才有效。这两个表中的x
不一样。
我想要做的是将表2中的深度x
与表1中的深度x
匹配(即将表2 x
中的1.1匹配到表1中的1.0 {{ 1}})。
我该怎么做?
Table 1
| x | y |
|---|----|
| 1 | 25 |
| 2 | 26 |
| 3 | 27 |
Table 2
| x | z |
|------|----|
| 1.1 | 30 |
| 2.05 | 35 |
| 3.8 | 34 |
我想要
Table 1
| x | y | z |
|---|----|----|
| 1 | 25 | 30 |
| 2 | 26 | 35 |
| 3 | 27 | NA |
前两个'x'值在Table 2
中具有匹配(绝对差异在10%以内)。第三个没有。
答案 0 :(得分:1)
提供数据后进行编辑:
从@ MKR的帖子中获取数据定义:
library(fuzzyjoin)
fuzzy_left_join(Table_1, Table_2,match_fun = function(x,y) y> x & y<=1.1*x )
# Joining by: "x"
# x.x y x.y z
# 1 1 25 1.10 30
# 2 2 26 2.05 35
# 3 3 27 NA NA
假数据的一般解释(第一个答案)
虚假数据
iris1 <- head(iris[1:2])
iris1
# Sepal.Length Sepal.Width
# 1 5.1 3.5
# 2 4.9 3.0
# 3 4.7 3.2
# 4 4.6 3.1
# 5 5.0 3.6
# 6 5.4 3.9
iris2 <- head(iris[c(1,3)])
set.seed(1)
# add noise
iris2$Sepal.Length <- iris2$Sepal.Length + rnorm(6,sd=0.05)
# shuffle rows
iris2 <- iris2[sample(seq(nrow(iris2))),]
iris2
# Sepal.Length Petal.Length
# 5 5.016475 1.4
# 2 4.909182 1.4
# 4 4.679764 1.5
# 6 5.358977 1.7
# 3 4.658219 1.3
# 1 5.068677 1.4
<强>码强>
library(fuzzyjoin)
fuzzy_left_join(iris1,iris2,match_fun= function(x,y) y>0.99*x & y<1.01*x )
# Joining by: "Sepal.Length"
# Sepal.Length.x Sepal.Width Sepal.Length.y Petal.Length
# 1 5.1 3.5 5.068677 1.4
# 2 4.9 3.0 4.909182 1.4
# 3 4.7 3.2 4.679764 1.5
# 4 4.7 3.2 4.658219 1.3
# 5 4.6 3.1 NA NA
# 6 5.0 3.6 5.016475 1.4
# 7 5.4 3.9 5.358977 1.7
我们看到一些行匹配得很好,让我们来看看例外情况。行号4在iris2
中添加了太多噪音,因此它与第3行配对,第3行有2个匹配。当我选择左连接时,仍会显示第4行,但NAs
的列为iris2
。
据我所知:
6*6==36
个元素)作为参数<
或&
)来返回逻辑向量,该向量将过滤这些长列以构建输出data.frame
。 distance_left_join
使用起来比较简单,但它绝对是距离,而不是相对距离。
答案 1 :(得分:0)
使用sqldf
的选项可以实现为:
library(sqldf)
sqldf("select T1.x, T1.y, A.z from Table_1 T1
left join (select Table_1.x, Table_1.y, Table_2.z from Table_1
left join Table_2 where round((100*abs(Table_1.x - Table_2.x)/Table_1.x),0) <= 10) A
on T1.x = A.x")
# x y z
# 1 1 25 30
# 2 2 26 35
# 3 3 27 NA
数据:强>
Table_1 <- read.table(text =
"x y
1 25
2 26
3 27",
header = TRUE)
Table_2 <- read.table(text =
"x z
1.1 30
2.05 35
3.8 34",
header = TRUE)