R:将索引匹配复制到相应的列

问题描述 投票:0回答:1

我想要实现的操作类似于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 中复制这一点更具挑战性……不太确定如何解决这个问题。任何建议将不胜感激。

r apply lookup index-match
1个回答
0
投票

您可以获取长格式的数据,删除

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
© www.soinside.com 2019 - 2024. All rights reserved.