% dplyr :: mutate(cost1 = ifelse(!is.na(ra-6ren">
gpt4 book ai didi

r - 如何将多个变量的值与查找表中的变量匹配?

转载 作者:行者123 更新时间:2023-12-04 17:15:22 28 4
gpt4 key购买 nike

我有两个数据集:

loc <- c("a","b","c","d","e")
id1 <- c(NA,9,3,4,5)
id2 <- c(2,3,7,5,6)
id3 <- c(2,NA,5,NA,7)
cost1 <- c(10,20,30,40,50)
cost2 <- c(50,20,30,30,50)
cost3 <- c(40,20,30,10,20)
dt <- data.frame(loc,id1,id2,id3,cost1,cost2,cost3)


id <- c(1,2,3,4,5,6,7)
rate <- c(0.9,0.8,0.7,0.6,0.5,0.4,0.3)
lookupd_tb <- data.frame(id,rate)

我想要做的是将 dt 中的值与 id1、id2 和 id3 的 lookup_tb 匹配,如果匹配,则将该 id 的比率与其相关成本相乘。

这是我的方法:
dt <- dt %>% 
left_join(lookupd_tb , by=c("id1"="id")) %>%
dplyr :: mutate(cost1 = ifelse(!is.na(rate), cost1*rate, cost1)) %>%
dplyr :: select (-rate)

我现在在做什么,工作正常,但我必须为每个变量重复 3 次,我想知道是否有更有效的方法来做到这一点(可能使用 apply family?)

我试图在查找表中用 id 连接所有三个变量,但是当 rate 与我的 dt 连接时,所有成本(cost1、cost2 和 cost3)将乘以我不想要的相同速率。

我感谢您的帮助!

最佳答案

一个 base R方法是使用 sapply/lapply 遍历“id”的列,获取 match 'lookupd_tb'的'id'列中的索引,根据索引,得到对应的'rate',replace NA元素为 1,乘以“成本”列并更新“成本”列

nmid <- grep("id", names(dt))
nmcost <- grep("cost", names(dt))

dt[nmcost] <- dt[nmcost]*sapply(dt[nmid], function(x) {
x1 <- lookupd_tb$rate[match(x, lookupd_tb$id)]
replace(x1, is.na(x1), 1) })

或使用 tidyverse ,我们可以使用 purrr::map2 遍历列集,即“id”和“cost” ,然后执行与上述相同的方法。唯一的区别是我们在这里创建了新列而不是更新“成本”列
library(tidyverse)
dt %>%
select(nmid) %>%
map2_df(., dt %>%
select(nmcost), ~
.x %>%
match(., lookupd_tb$id) %>%
lookupd_tb$rate[.] %>%
replace(., is.na(.),1) * .y ) %>%
rename_all(~ paste0("costnew", seq_along(.))) %>%
bind_cols(dt, .)

关于r - 如何将多个变量的值与查找表中的变量匹配?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50352043/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com