如何基于另一个DataFrame中的值过滤目标DataFrame数据?
如何用另一个DataFrame过滤目标DataFrame的数据?
核心问题是你的df里Dest_county的格式和val_df中COUNTY_NAM不匹配(一个带"County"后缀、混合大小写,一个是大写无后缀),得先统一格式再过滤,下面给两种常用解决方案:
样本数据回顾
# 待过滤的目标DataFrame Dest_FIPS = c(1,2,3,4) Dest_county = c("West Palm Beach County","Brevard County","Bay County","Miami-Dade County") Dest_State = c("FL", "FL", "FL", "FL") OutFlow = c(111, 222, 333, 444) Orig_county = c("Broward County", "Broward County", "Broward County", "Broward County") Orig_FIPS = c(5,5,5,5) Orig_State = c("FL", "FL", "FL", "FL") df = data.frame(Dest_FIPS, Dest_county, Dest_State, OutFlow, Orig_county, Orig_FIPS, Orig_State) # 用于过滤的参考DataFrame COUNTY_NAM = c("WEST PALM BEACH","BAY","MIAMI-DADE") val_df = data.frame(COUNTY_NAM)
方法1:基础R实现
先把df的Dest_county处理成和val_df一致的格式,再用%in%匹配过滤:
# 处理Dest_county:去掉末尾的" County"并转大写 df$match_county <- toupper(gsub(" County$", "", df$Dest_county)) # 过滤出匹配的行,同时只保留需要的列 filtered_df <- df[df$match_county %in% val_df$COUNTY_NAM, c("Dest_FIPS", "Dest_county", "OutFlow", "Orig_county")] # 输出结果 print(filtered_df)
方法2:dplyr包实现(更简洁)
如果习惯用tidyverse系列工具,链式操作会更直观:
library(dplyr) library(stringr) # 用于str_remove函数 filtered_df <- df %>% # 生成匹配用的列:去掉" County"后缀并转大写 mutate(match_county = toupper(str_remove(Dest_county, " County$"))) %>% # 过滤出在val_df列表里的行 filter(match_county %in% val_df$COUNTY_NAM) %>% # 选择需要保留的列 select(Dest_FIPS, Dest_county, OutFlow, Orig_county) print(filtered_df)
最终输出结果
运行代码后会得到你期望的结果:
Dest_FIPS Dest_county OutFlow Orig_county 1 1 West Palm Beach County 111 Broward County 3 3 Bay County 333 Broward County 4 4 Miami-Dade County 444 Broward County
补充说明:如果val_df是从CSV导入的,直接用val_df <- read.csv("你的文件路径.csv")读取即可,只要确保CSV里的列名是COUNTY_NAM,或读取时用col.names调整列名。
内容的提问来源于stack exchange,提问作者Ed_Gravy
相关产品推荐
相关产品推荐

