r - 如何根据另一个查找表/数据框自动插入一个数据框的值?
问题描述
我有一个数据框和一个查找表。我想要的是df_dat$value
与df_lookup$threshold
. 如果value
落在threshold
范围内,则在其中创建一个新列transfer
,df_dat
以便其值从 中的transfer
列线性插值df_lookup
library(dplyr)
df_lookup <- tribble(
~threshold, ~transfer,
0, 0,
100, 15,
200, 35
)
df_lookup
#> # A tibble: 3 x 2
#> threshold transfer
#> <dbl> <dbl>
#> 1 0 0
#> 2 100 15
#> 3 200 35
df_dat <- tribble(
~date, ~value,
"2009-01-01", 0,
"2009-01-02", 30,
"2009-01-06", 105,
"2009-01-09", 150
)
df_dat
#> # A tibble: 4 x 2
#> date value
#> <chr> <dbl>
#> 1 2009-01-01 0
#> 2 2009-01-02 30
#> 3 2009-01-06 105
#> 4 2009-01-09 150
我可以像这样手动执行此操作,但想知道是否有基于df_lookup
表中值的自动方式?谢谢你。
df_dat %>%
mutate(transfer = case_when(value > 0 & value < 100 ~ 0 + (value - 0)*(15 - 0)/(100 - 0),
value >= 100 & value < 200 ~ 15 + (value - 100)*(35 - 15)/(200 - 100),
TRUE ~ 0)
)
#> # A tibble: 4 x 3
#> date value transfer
#> <chr> <dbl> <dbl>
#> 1 2009-01-01 0 0
#> 2 2009-01-02 30 4.5
#> 3 2009-01-06 105 16
#> 4 2009-01-09 150 25
解决方案
您可以使用approx
df_dat %>% mutate(transfer = with(df_lookup, approx(threshold, transfer, value))$y)
## A tibble: 4 x 3
# date value transfer
# <chr> <dbl> <dbl>
#1 2009-01-01 0 0
#2 2009-01-02 30 4.5
#3 2009-01-06 105 16
#4 2009-01-09 150 25
推荐阅读
- java - 扫描文本文件时出现 NetBeans 错误
- dart - Dart 中的 this[x] 等价于什么?
- .htaccess - Apache 重定向指令不作为最终规则
- ios - 无法以编程方式在 TableView 中自动滚动到特定部分
- amazon-web-services - AWS EventBridge 规则触发两次
- php - .htaccess url 重写一夜之间失败
- karate - 使用 0.9.5.RC4 的 Karate.toMap() 适用于场景,但不适用于场景大纲
- firebase - 在 Firestore 规则中引用变量
- python - 500 错误:“timeline_id”列中的空值违反非空约束
- r - 以有序格式将 2 列粘贴到新变量