如何在R中汇总组外观测值?复现Gayle & Wu(2013)统计需求
解决方案
假设我们以2017年的ATL-AUS市场为例,以下是具体实现步骤:
步骤1:拆分市场的出发地与目的地
先将两个年份数据中的MARKET字段拆分为出发地(ORIGIN)和目的地(DEST),方便后续判断航司是否运营目标市场的端点:
# 加载必要包(未安装则先执行安装) if (!require(tidyr)) install.packages("tidyr") library(tidyr) # 拆分2016年数据的市场字段 df_2016_split <- df_2016 %>% separate(MARKET, into = c("ORIGIN", "DEST"), sep = "-") # 拆分2017年数据的市场字段(用于明确目标市场端点) df_2017_split <- df_2017 %>% separate(MARKET, into = c("ORIGIN", "DEST"), sep = "-")
步骤2:提取关键航司集合
设定目标市场为ATL-AUS,提取两个核心航司集合:
# 目标市场的两个端点 target_origin <- "ATL" target_dest <- "AUS" # 集合1:2016年运营目标端点(ATL或AUS)的所有航司 carriers_endpoints <- unique(df_2016_split$AIRLINE[ df_2016_split$ORIGIN %in% c(target_origin, target_dest) | df_2016_split$DEST %in% c(target_origin, target_dest) ]) # 集合2:2016年已进入目标市场(ATL-AUS)的所有航司 carriers_in_market <- unique(df_2016$AIRLINE[df_2016$MARKET == paste(target_origin, target_dest, sep = "-")])
步骤3:计算符合条件的航司数量
用端点运营航司集合减去已进入目标市场的航司集合,统计剩余航司的数量:
# 筛选符合条件的航司:运营端点但未进入目标市场 qualified_carriers <- setdiff(carriers_endpoints, carriers_in_market) # 统计数量并输出 qualified_count <- length(qualified_carriers) cat("符合条件的航空公司数量:", qualified_count, "\n") cat("具体航司:", paste(qualified_carriers, collapse = ", "), "\n")
通用化函数(批量处理用)
如果需要批量计算2017年多个市场的结果,可以封装成函数:
count_qualified_carriers <- function(target_market, df_2016) { # 拆分目标市场的端点 target_split <- strsplit(target_market, "-")[[1]] target_origin <- target_split[1] target_dest <- target_split[2] # 拆分2016年数据的市场字段 df_2016_split <- separate(df_2016, MARKET, into = c("ORIGIN", "DEST"), sep = "-") # 提取运营端点的航司 carriers_endpoints <- unique(df_2016_split$AIRLINE[ df_2016_split$ORIGIN %in% c(target_origin, target_dest) | df_2016_split$DEST %in% c(target_origin, target_dest) ]) # 提取已进入目标市场的航司 carriers_in_market <- unique(df_2016$AIRLINE[df_2016$MARKET == target_market]) # 返回符合条件的航司数量 return(length(setdiff(carriers_endpoints, carriers_in_market))) } # 调用示例:计算2017年ATL-AUS市场的符合条件航司数量 count_qualified_carriers("ATL-AUS", df_2016)
内容的提问来源于stack exchange,提问作者aerw4
相关产品推荐
相关产品推荐

