如何基于三个变量创建二元变量并程序化计算desired_output?
计算desired_output的实现方案
先帮你拆解需求和示例数据的对应关系:从你给出的示例来看,desired_output的生成规则可以总结为:
- 当
airline == 1(航司运营当前city1-city2航线),直接标记为1; - 当
airline == 0(航司不运营当前航线),标记为1的条件是该航司同时运营了city1的其他航线和city2的其他航线(这点和你描述的“或”略有差异,我会同时给出两种逻辑的代码)。
方案1:完全匹配示例数据的逻辑(同时运营city1和city2的其他航线)
我们可以先统计每个城市被该航司运营的航线数量,再基于统计结果计算目标变量:
# 先安装并加载dplyr(如果没装过的话) # install.packages("dplyr") library(dplyr) # 你的原始数据 airline<-c(0,0,1,0,0,1) city1<-c('a','a','a','b','b','c') city2<-c('b','c','d','c','d','d') mktdf<-data.frame(airline, city1, city2) # 步骤1:统计每个城市的运营航线数(仅统计airline=1的航线) city_operation_counts <- mktdf %>% filter(airline == 1) %>% pivot_longer(cols = c(city1, city2), names_to = "type", values_to = "city") %>% count(city, name = "operation_count") # 步骤2:合并统计结果到原数据,计算desired_output mktdf <- mktdf %>% left_join(city_operation_counts, by = c("city1" = "city")) %>% rename(city1_ops = operation_count) %>% left_join(city_operation_counts, by = c("city2" = "city")) %>% rename(city2_ops = operation_count) %>% # 把NA替换为0(表示该城市没有被运营的航线) mutate(across(c(city1_ops, city2_ops), ~replace_na(., 0))) %>% # 按规则生成目标变量 mutate(desired_output = case_when( airline == 1 ~ 1, airline == 0 & city1_ops > 0 & city2_ops > 0 ~ 1, TRUE ~ 0 )) %>% # 移除中间变量(可选操作) select(-city1_ops, -city2_ops) # 查看最终结果 mktdf
运行这段代码后,你会得到和示例完全一致的desired_output。
方案2:符合你文字描述的逻辑(运营city1或city2的其他航线)
如果你确实需要“或”的逻辑(只要city1或city2有其他运营航线就标记为1),只需要修改case_when里的判断条件:
mktdf <- mktdf %>% # 前面的步骤和方案1完全一致 mutate(desired_output = case_when( airline == 1 ~ 1, airline == 0 & (city1_ops > 0 | city2_ops > 0) ~ 1, TRUE ~ 0 ))
修改后,第一行的desired_output会变成1(因为city1=a有运营航线),这完全匹配你文字描述的逻辑。
不用dplyr的基础R实现
如果你不想依赖dplyr,也可以用基础R代码完成:
# 原始数据 airline<-c(0,0,1,0,0,1) city1<-c('a','a','a','b','b','c') city2<-c('b','c','d','c','d','d') mktdf<-data.frame(airline, city1, city2) # 先找出所有被航司运营的城市 operated_cities <- unique(c(mktdf$city1[mktdf$airline == 1], mktdf$city2[mktdf$airline == 1])) # 计算desired_output(示例逻辑:同时运营) mktdf$desired_output <- ifelse(mktdf$airline == 1, 1, ifelse((mktdf$city1 %in% operated_cities) & (mktdf$city2 %in% operated_cities), 1, 0)) # 如果要切换为描述逻辑(或),替换为下面的代码: # mktdf$desired_output <- ifelse(mktdf$airline == 1, 1, # ifelse((mktdf$city1 %in% operated_cities) | (mktdf$city2 %in% operated_cities), 1, 0))
内容的提问来源于stack exchange,提问作者SeánMcK
相关产品推荐
相关产品推荐

