在R中实现类Excel INDEX MATCH,提取各国最新通胀有效数据
解决R中提取各国最新非NA通胀数据的问题
方法一:使用tidyverse工具(推荐,代码更简洁易读)
先把宽格式的dta转成长格式,再按国家分组筛选最新非NA数据,最后合并到new_frm中:
# 先安装并加载tidyverse包(未安装则运行install.packages("tidyverse")) library(tidyverse) # 1. 将宽表转长表,移除通胀值为NA的行 long_dta <- dta %>% pivot_longer(cols = -日期, names_to = "Country", values_to = "Inflation") %>% drop_na(Inflation) # 2. 按国家分组,取最新日期的非NA通胀值 latest_inflation <- long_dta %>% group_by(Country) %>% arrange(desc(日期)) %>% # 按日期降序排序 slice(1) %>% # 取每组第一行(最新数据) ungroup() %>% select(Country, Inflation) # 3. 合并到new_frm,填充Latest列 new_frm <- new_frm %>% left_join(latest_inflation, by = "Country") %>% rename(Latest = Inflation)
方法二:基础R实现(无需额外包)
如果不想加载tidyverse,用基础R循环处理每个国家列:
# 获取所有国家列名(排除日期列) countries <- setdiff(colnames(dta), "日期") # 循环提取每个国家的最新非NA通胀值 latest_values <- sapply(countries, function(country) { # 筛选该国家非NA的行 non_na_rows <- dta[!is.na(dta[[country]]), ] if (nrow(non_na_rows) == 0) return(NA) # 全为NA时返回NA # 按日期降序排序,取第一行的通胀值 sorted_rows <- non_na_rows[order(non_na_rows$日期, decreasing = TRUE), ] sorted_rows[1, country] }) # 转成数据框并合并到new_frm latest_df <- data.frame(Country = names(latest_values), Latest = latest_values) new_frm <- merge(new_frm, latest_df, by = "Country", all.x = TRUE)
注意事项
- 如果你的日期列不是日期格式,先执行
dta$日期 <- as.Date(dta$日期),确保排序逻辑正确。 - 若某个国家的通胀数据全为NA,代码会在
Latest列填充NA,可根据需求修改(比如替换为0或特定标记)。
内容的提问来源于stack exchange,提问作者Ryan Walter
相关产品推荐
相关产品推荐

