Merge 基于区间合并两个数据集

Merge 基于区间合并两个数据集,merge,Merge,我想知道如何通过a和b合并这两个数据集a列是区间的下限,因此我需要将g数据集中的1.5与f中的1、g中的4.4与f中的4、g中的9.8与f中的9合并,等等 a<-seq(1:10) b<-c("a","b","a","b","a","a","a","b","b","a") f<-data.frame(a,b) a<-c(1.5,1.4,2.3,2.2,4.4,4,5,6.6,9.8,4.1,4.6,5.5) b<-c("a","b","b","b","a","b"

我想知道如何通过a和b合并这两个数据集a列是区间的下限,因此我需要将g数据集中的1.5与f中的1、g中的4.4与f中的4、g中的9.8与f中的9合并,等等

a<-seq(1:10)
b<-c("a","b","a","b","a","a","a","b","b","a")
f<-data.frame(a,b)

a<-c(1.5,1.4,2.3,2.2,4.4,4,5,6.6,9.8,4.1,4.6,5.5)
b<-c("a","b","b","b","a","b","a","b","a","b","a","b")
m<-seq(1:12)
g<-data.frame(a,b,m)

a不确定您在这里到底要找什么,但是
floor()
函数应该能满足您的需要。一般来说,您还可以研究,特别是对于数据操作

现在还不完全清楚您希望输出的是什么-合并后
b
列有点不同-您是否只想要匹配的记录?如果不关心不匹配的记录,请删除
all.x
all.y
参数。我还假设重命名列的顺序可能是:

a <- seq(1:10)
b <- c("a", "b", "a", "b", "a", "a", "a", "b", "b", "a")
f <- data.frame(a, b)

a <- c(1.5, 1.4, 2.3, 2.2, 4.4, 4, 5, 6.6, 9.8, 4.1, 4.6, 5.5)
b <- c("a", "b", "b", "b", "a", "b", "a", "b", "a", "b", "a", "b")
m <- seq(1:12)
g <- data.frame(a, b, m)

## floor function takes care of rounding down
g$c <- floor(g$a)

merge(f, g, by.x = "a", by.y = "c", all.x = TRUE, all.y = TRUE)
#> Warning in merge.data.frame(f, g, by.x = "a", by.y = "c", all.x = TRUE, :
#> column name 'a' is duplicated in the result
#>     a b.x   a  b.y  m
#> 1   1   a 1.5    a  1
#> 2   1   a 1.4    b  2
#> 3   2   b 2.3    b  3
#> 4   2   b 2.2    b  4
#> 5   3   a  NA <NA> NA
#> 6   4   b 4.4    a  5
#> 7   4   b 4.0    b  6
#> 8   4   b 4.6    a 11
#> 9   4   b 4.1    b 10
#> 10  5   a 5.5    b 12
#> 11  5   a 5.0    a  7
#> 12  6   a 6.6    b  8
#> 13  7   a  NA <NA> NA
#> 14  8   b  NA <NA> NA
#> 15  9   b 9.8    a  9
#> 16 10   a  NA <NA> NA
a 5 3 a NA NA
#>6 4 b 4.4 a 5
#>7 4 b 4.0 b 6
#>8 4 b 4.6 a 11
#>9 4 b 4.1 b 10
#>10 5 a 5.5 b 12
#>11.5 a 5.0 a 7
#>12 6 a 6.6 b 8
#>13.7 a NA NA
#>14 8 b不适用
#>15 9 b 9.8 a 9
#>16 10 a NA NA

不确定您在这里到底要找什么,但是
floor()
函数应该能满足您的需要。一般来说,您还可以研究,特别是对于数据操作

现在还不完全清楚您希望输出的是什么-合并后
b
列有点不同-您是否只想要匹配的记录?如果不关心不匹配的记录,请删除
all.x
all.y
参数。我还假设重命名列的顺序可能是:

a <- seq(1:10)
b <- c("a", "b", "a", "b", "a", "a", "a", "b", "b", "a")
f <- data.frame(a, b)

a <- c(1.5, 1.4, 2.3, 2.2, 4.4, 4, 5, 6.6, 9.8, 4.1, 4.6, 5.5)
b <- c("a", "b", "b", "b", "a", "b", "a", "b", "a", "b", "a", "b")
m <- seq(1:12)
g <- data.frame(a, b, m)

## floor function takes care of rounding down
g$c <- floor(g$a)

merge(f, g, by.x = "a", by.y = "c", all.x = TRUE, all.y = TRUE)
#> Warning in merge.data.frame(f, g, by.x = "a", by.y = "c", all.x = TRUE, :
#> column name 'a' is duplicated in the result
#>     a b.x   a  b.y  m
#> 1   1   a 1.5    a  1
#> 2   1   a 1.4    b  2
#> 3   2   b 2.3    b  3
#> 4   2   b 2.2    b  4
#> 5   3   a  NA <NA> NA
#> 6   4   b 4.4    a  5
#> 7   4   b 4.0    b  6
#> 8   4   b 4.6    a 11
#> 9   4   b 4.1    b 10
#> 10  5   a 5.5    b 12
#> 11  5   a 5.0    a  7
#> 12  6   a 6.6    b  8
#> 13  7   a  NA <NA> NA
#> 14  8   b  NA <NA> NA
#> 15  9   b 9.8    a  9
#> 16 10   a  NA <NA> NA
a 5 3 a NA NA
#>6 4 b 4.4 a 5
#>7 4 b 4.0 b 6
#>8 4 b 4.6 a 11
#>9 4 b 4.1 b 10
#>10 5 a 5.5 b 12
#>11.5 a 5.0 a 7
#>12 6 a 6.6 b 8
#>13.7 a NA NA
#>14 8 b不适用
#>15 9 b 9.8 a 9
#>16 10 a NA NA