首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于更大等条件的不精确连接数据

基于更大等条件的不精确连接数据
EN

Stack Overflow用户
提问于 2022-11-28 13:44:32
回答 2查看 44关注 0票数 2

我在df中有一些值。

代码语言:javascript
复制
# A tibble: 7 × 1
   var1
  <dbl>
1     0
2    10
3    20
4   210
5   230
6   266
7   267

,我想将它与第二个名为value_lookup的数据帧进行比较。

代码语言:javascript
复制
# A tibble: 4 × 2
   var1 value
  <dbl> <dbl>
1     0     0
2   200    10
3   230    20
4   260    30

在特殊情况下,我想基于>=进行一个连接,这意味着一个大于或等于var1中的数字的值得到x的值。例如,以原始数据的210为例。因为它是>= 200<230,所以它的值为10。

下面是预期的输出

代码语言:javascript
复制
  var1 value
1    0     0
2   10     0
3   20     0
4  210    10
5  230    20
6  266    30
7  267    30

我认为使用{fuzzyjoin}应该是可行的,但我做不到。

代码语言:javascript
复制
value_lookup <- tibble(var1 = c(0, 200,230,260),
                       value = c(0,10,20,30))

df <- tibble(var1 = c(0,10,20,210,230,266,267))

library(fuzzyjoin)
fuzzyjoin::fuzzy_left_join(
  x = df, 
  y = value_lookup ,
  by = "var1",
  match_fun = list(`>=`)
) 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-28 14:12:09

一个选项也是findInterval

代码语言:javascript
复制
df$value <- value_lookup$value[findInterval(df$var1, value_lookup$var1)]

输出:

代码语言:javascript
复制
  var1 value
1    0     0
2   10     0
3   20     0
4  210    10
5  230    20
6  266    30
7  267    30

正如您提到的联接一样,您也可以通过data.table使用参数roll = T进行滚动连接,该参数将在var1之前在df中查找相同或最近的值

代码语言:javascript
复制
library(data.table)

setDT(value_lookup)[setDT(df), on = 'var1', roll = T]
票数 4
EN

Stack Overflow用户

发布于 2022-11-28 14:03:44

您可以使用cut

代码语言:javascript
复制
df$value <- value_lookup$value[cut(df$var1, 
                                   c(value_lookup$var1, Inf), 
                                   right=F)]
# # A tibble: 7 x 2
#    var1 value
#   <dbl> <dbl>
# 1     0     0
# 2    10     0
# 3    20     0
# 4   210    10
# 5   230    20
# 6   266    30
# 7   267    30
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74601512

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档