我在df中有一些值。
# A tibble: 7 × 1
var1
<dbl>
1 0
2 10
3 20
4 210
5 230
6 266
7 267,我想将它与第二个名为value_lookup的数据帧进行比较。
# 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。
下面是预期的输出
var1 value
1 0 0
2 10 0
3 20 0
4 210 10
5 230 20
6 266 30
7 267 30我认为使用{fuzzyjoin}应该是可行的,但我做不到。
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(`>=`)
) 发布于 2022-11-28 14:12:09
一个选项也是findInterval
df$value <- value_lookup$value[findInterval(df$var1, value_lookup$var1)]输出:
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中查找相同或最近的值
library(data.table)
setDT(value_lookup)[setDT(df), on = 'var1', roll = T]发布于 2022-11-28 14:03:44
您可以使用cut
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 30https://stackoverflow.com/questions/74601512
复制相似问题