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

如何在R中筛选各出发地占比最高目的地的观测值

数据处理与检测方案(R语言)

问题背景与需求

你手头有一组记录2011年工作地、2012年移居后工作地的人员数据,包含薪资等额外字段。你的需求分为两部分:

  1. 保留每个**2011年工作地(Work_2011)对应的2012年工作地(Work_2012)**中占比最高的所有观测值;
  2. 学习如何在R中检测那些同一出发地但目的地不同的观测记录。

原始数据

NameWork_2011Work_2012Wage_2011Wage_2012
JackUSUK538735353
BillUSUK435345343
EmmaUSFRANCE3453453455
BrandUSFRANCE645451343
LuiguiUSFRANCE153433144
EllaUSFRANCE645451343
LucieFranceSPAIN845451343
MariaFranceSPAIN9845451343
GrecItalyUS45451343

期望输出结果

NameWork_2011Work_2012Wage_2011Wage_2012
EmmaUSFRANCE3453453455
BrandUSFRANCE645451343
LuiguiUSFRANCE153433144
EllaUSFRANCE645451343
LucieFranceSPAIN845451343
MariaFranceSPAIN9845451343
GrecItalyUS45451343

R语言实现方案

1. 筛选每个出发地占比最高的目的地观测值

我们用dplyr包来高效完成这个筛选逻辑,步骤很清晰:先统计每个出发地对应各目的地的出现次数,再选出频次最高的目的地,最后匹配原始数据得到结果。

# 加载dplyr包(如果没安装先运行install.packages("dplyr"))
library(dplyr)

# 构造你的原始数据框
df <- data.frame(
  Name = c("Jack", "Bill", "Emma", "Brand", "Luigui", "Ella", "Lucie", "Maria", "Grec"),
  Work_2011 = c("US", "US", "US", "US", "US", "US", "France", "France", "Italy"),
  Work_2012 = c("UK", "UK", "FRANCE", "FRANCE", "FRANCE", "FRANCE", "SPAIN", "SPAIN", "US"),
  Wage_2011 = c(5387, 43534, 34534, 64545, 15343, 64545, 84545, 984545, 4545),
  Wage_2012 = c(35353, 5343, 53455, 1343, 3144, 1343, 1343, 1343, 1343),
  stringsAsFactors = FALSE
)

# 第一步:找出每个Work_2011组内频次最高的Work_2012
top_destinations <- df %>%
  group_by(Work_2011, Work_2012) %>%
  summarise(count = n(), .groups = "drop_last") %>%  # 统计每组内各目的地的数量
  slice_max(count, n = 1) %>%  # 取频次最高的目的地
  ungroup() %>%
  select(Work_2011, Work_2012)  # 只保留需要匹配的列

# 第二步:匹配原始数据,得到最终筛选结果
final_result <- df %>%
  inner_join(top_destinations, by = c("Work_2011", "Work_2012"))

# 查看结果
print(final_result)

如果遇到某个出发地有多个目的地频次相同的情况(比如两个目的地各出现3次),可以把slice_max里的with_ties = TRUE加上,这样会保留所有并列最高的类别。

2. 检测同一出发地存在不同目的地的观测值

如果你想找出那些出发地对应多个目的地的记录,有两种常用方式:

方式一:提取所有存在多目的地的出发地的观测

# 先找出有多个不同目的地的出发地
multi_dest_origins <- df %>%
  group_by(Work_2011) %>%
  summarise(unique_dests = n_distinct(Work_2012)) %>%
  filter(unique_dests > 1) %>%
  pull(Work_2011)  # 提取出发地名称

# 筛选这些出发地的所有记录
multi_dest_records <- df %>%
  filter(Work_2011 %in% multi_dest_origins)

print(multi_dest_records)

运行后会输出示例中US组的所有记录(因为US对应UK和FRANCE两个目的地)。

方式二:在原始数据中标记多目的地组

如果你想给每条记录加个标记,说明它是否来自存在多目的地的出发地,可以这样做:

df_with_flag <- df %>%
  group_by(Work_2011) %>%
  mutate(has_multiple_destinations = n_distinct(Work_2012) > 1) %>%
  ungroup()

print(df_with_flag)

新增的has_multiple_destinations列会显示TRUE或FALSE,帮你快速识别这类记录。


内容的提问来源于stack exchange,提问作者M.KKK

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:58:23