我想要实现的操作类似于Excel风格的INDEX MATCH。本质上,我有一个框架:
dta <- read_excel('CPI/Global Inflation New.xlsm',
sheet = 'Cleaned', skip = 1)
colnames(dta)[1] <- 'Date'
dta$Date <- as.Date(dta$Date, format='%d%m%Y')
看起来像这样:
| Date US Canada EU Germany
---------------------------------------------------
1 | 2023-03-15 3.1 2.8 0.9 1.3
2 | 2023-04-15 3.3 2.5 1.2 1.5
3 | 2023-05-15 3.2 2.6 1.0 1.4
.
45 | 2024-04-15 2.9 2.7 2.1 2.1
46 | 2024-05-15 NA 2.6 NA 2.3
我想创建一个新框架,其中国家/地区标题为一列,第二列为该国家/地区的最新值。例如:
| Country Latest
-----------------------------
1 | US 2.9
2 | Canada 2.6
3 | EU 2.1
到目前为止的“新框架”是:
new_frm <- data.frame(colnames(dta[, -1]))
colnames(new_frm)[1] <- 'Country'
new_frm <- cbind(new_frm, "Latest"=NA)
我无法弄清楚如何从 dta 框架中提取相关值。在 Excel 中,我只需将国家/地区名称作为查找值传递给 MATCH 函数,然后返回相应的值(可能是最近的三个日期)。事实证明,在 R 中复制这一点更具挑战性……不太确定如何解决这个问题。任何建议将不胜感激。
您可以获取长格式的数据,删除
NA
值并获取该国家/地区可用的最新日期的相应值。
library(dplyr)
library(tidyr)
dta %>%
pivot_longer(cols = -Date, names_to = "Country", values_to = "Latest",
values_drop_na = TRUE) %>%
summarise(Latest = Latest[which.max(Date)], .by = Country)
# Country Latest
# <chr> <dbl>
#1 US 2.9
#2 Canada 2.6
#3 EU 2.1
#4 Germany 2.3