首页 > 解决方案 > 查找位于其他 DataFrame 上的两列值之间的 DataFrame 的值

问题描述

我有两个数据框。dataframe_A 包含用户和给定值:

dfA <- structure(list(User = 1:5, Value = c(54L, 12L, 7L, 123L, 74L)), 
                 row.names = c(NA, -5L), class = "data.frame")
dfA
#>   User Value
#> 1    1    54
#> 2    2    12
#> 3    3     7
#> 4    4   123
#> 5    5    74

dfB 包含值范围和我想添加到 dfA 的乘数:



dfB <- structure(list(Min = c(0L, 50L, 80L, 100L, 120L), 
                      Max = c(50L, 80L, 100L, 120L, 1000L), 
                      Mult = c(0, 0.5, 0.8, 1, 1.2)), 
                 class = "data.frame", row.names = c(NA, -5L))
dfB
#>   Min  Max Mult
#> 1   0   50  0.0
#> 2  50   80  0.5
#> 3  80  100  0.8
#> 4 100  120  1.0
#> 5 120 1000  1.2

所以想要的结果是将 dfB 中的乘数添加到 dfB:

dfA
    User Value  Mult 
[1]    1    54   0.5
[2]    2    12     0
[3]    3     7     0
[4]    4   123   1.2
[5]    5    74   0.5

我已经尝试过这段代码(它适用于单个值),但在数据框中不起作用:

dfA$Mult <- print(subset(dfB, dfA$Value > dfB$Min & dfA$Value < dfB$Max)$Mult)

提前致谢!

标签: r

解决方案


如果间隔 indfB形成更大范围的分区,如示例中那样按顺序间隔将其切割,我们还可以使用findIntervalorcut将 in 的值匹配到 indfA的间隔dfB。与findInterval

findInterval(x = dfA$Value, vec = c(dfB$Min[1], dfB$Max))
#> [1] 2 1 1 5 2

结合在 中创建一个新MultdfA,我们可以这样写:

dfA$Mult <- with(dfB, Mult[findInterval(x = dfA$Value, vec = c(Min[1], Max))])

dfA
#>   User Value Mult
#> 1    1    54  0.5
#> 2    2    12  0.0
#> 3    3     7  0.0
#> 4    4   123  1.2
#> 5    5    74  0.5

免责声明:findInterval如果间隔不能很好地排列,则使用会变得更加乏味dfB,在这种情况下,Ronak 的方法可能更直接。


推荐阅读