You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于另一个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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 14:35:19