gpt4 book ai didi

r - Vlookup-match like R 中的函数

转载 作者:行者123 更新时间:2023-12-03 14:21:15 25 4
gpt4 key购买 nike

我是 R 的新手,目前我要将我对 R 的知识应用到我必须执行的分析工作中。

我有两个数据框 - 数据框 A 包含交易详情,而数据框 B 包含各种货币的每月收盘汇率。

数据框 A - 交易详情

    TRANSACTION_ID COLLECTION_CRNCY COLLECTION_AMT   MMYYYY  LODG_DATE
1 0001 INR 305000 Mar 2014 2014-03-01
2 0002 USD 15000 Oct 2014 2014-10-31
3 0003 JPY 85000 Feb 2015 2015-02-09
4 0004 CNY 1800000 Mar 2015 2015-03-27

structure(list(TRANSACTION_ID = c("0001", "0002", "0003", "0004"),
COLLECTION_CRNCY = c("INR", "USD", "JPY", "CNY"), COLLECTION_AMT = c(305000,
15000, 85000, 1800000), MMYYYY = structure(c(2014.16666666667,
2014.75, 2015.08333333333, 2015.16666666667), class = "yearmon"),
LODG_DATE = structure(c(16130, 16374, 16475, 16521), class = "Date")),
row.names = c(NA, -4L), class = "data.frame")

数据框 B - 汇率

    MMYYYY       Date    CNY    INR     JPY       USD
1 Mar 2014 2014-03-31 4.9444 47.726 82.0845 0.7951654
2 Oct 2014 2014-10-31 4.7552 47.749 87.2604 0.7778469
3 Feb 2015 2015-02-27 4.5990 45.222 87.7690 0.7338372
4 Mar 2015 2015-03-31 4.5179 45.383 87.5395 0.7287036

structure(list(MMYYYY = structure(c(2014.16666666667,
2014.75, 2015.08333333333, 2015.16666666667), class = "yearmon"),
Date = structure(c(16160, 16374, 16493, 16525), class = "Date"), CNY =
c(4.9444, 4.7552, 4.599, 4.5179), INR = c(47.726, 47.749, 45.222, 45.383),
JPY = c(82.0845, 87.2604, 87.769, 87.5395), USD = c(0.795165394, 0.77784692,
0.733837235, 0.728703636)), .Names = c("MMYYYY", "Date", "CNY", "INR", "JPY",
"USD"), class = "data.frame", row.names = c(NA, -4L))

我想做的是在数据框 A 中创建一个可能名为 Exchange Rate 的新列。我想通过查找数据框 B,通过将数据框 A 中的 COLLECTION_CRNCYMMYYYY 匹配到数据框 B 来获取此汇率值。即:

TRANSACTION_ID COLLECTION_CRNCY COLLECTION_AMT   MMYYYY  LODG_DATE exchange.rate
1 0001 INR 305000 Mar 2014 2014-03-01 47.7260000
2 0002 USD 15000 Oct 2014 2014-10-31 0.7778469
3 0003 JPY 85000 Feb 2015 2015-02-09 87.7690000
4 0004 CNY 1800000 Mar 2015 2015-03-27 4.5179000

我可以使用 vlookup 和 match 通过 Excel 轻松完成此操作,但我想知道如何使用 R 实现相同的结果,因为我的交易详细信息文件非常庞大。

最佳答案

这是一种可能的 data.table 方法。基本上你需要做的是将 df2 转换为长格式,然后只是一个简单的(二进制)左连接到 df1

library(data.table)
temp <- melt(setDT(df2[-2]), "MMYYYY", variable.name = "COLLECTION_CRNCY")
setkey(setDT(df1), MMYYYY, COLLECTION_CRNCY)[temp, exchange.rate := i.value]
df1
# TRANSACTION_ID COLLECTION_CRNCY COLLECTION_AMT MMYYYY LODG_DATE exchange.rate
# 1: 0001 INR 305000 2014.167 2014-03-01 47.7260000
# 2: 0002 USD 15000 2014.750 2014-10-31 0.7778469
# 3: 0003 JPY 85000 2015.083 2015-02-09 87.7690000
# 4: 0004 CNY 1800000 2015.167 2015-03-27 4.5179000

或者,您可以使用“Hadleyverse”做类似的事情,但 dplyr 将无法在 zoo 类列上合并(目前),因此您将需要先取消分类

library(dplyr)
library(tidyr)
df2[-2] %>%
gather(COLLECTION_CRNCY, exchange.rate, -MMYYYY) %>%
mutate(MMYYYY = as.numeric(MMYYYY)) %>%
left_join(df1 %>% mutate(MMYYYY = as.numeric(MMYYYY)), .,
by = c("MMYYYY", "COLLECTION_CRNCY"))
# TRANSACTION_ID COLLECTION_CRNCY COLLECTION_AMT MMYYYY LODG_DATE exchange.rate
# 1 0001 INR 305000 2014.167 2014-03-01 47.7260000
# 2 0002 USD 15000 2014.750 2014-10-31 0.7778469
# 3 0003 JPY 85000 2015.083 2015-02-09 87.7690000
# 4 0004 CNY 1800000 2015.167 2015-03-27 4.5179000

关于r - Vlookup-match like R 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31366548/

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