R语言如何通过循环按不同列匹配两个dataframe并生成哑变量
实现方案(R语言)
首先先预处理数据,修正df_key中keyword2列的多余空格,避免匹配失败:
library(dplyr) library(tidyr) # 预处理关键字列的首尾空格 df_key <- df_key %>% mutate(across(starts_with("keyword"), trimws))
方法1:tidyverse高效实现(推荐,无需手动写for循环)
# 1. 长表转换+匹配国家+宽表还原 df_result <- df_key %>% # 把所有keyword列转为长表格式 pivot_longer(cols = starts_with("keyword"), names_to = "keyword_idx", values_to = "city") %>% # 关联国家城市对应表匹配国家 left_join(df_country, by = "city") %>% # 提取关键字的序号,比如keyword1提取数字1 mutate(keyword_idx = gsub("keyword", "", keyword_idx)) %>% # 转回宽表还原成预期输出结构 pivot_wider(names_from = keyword_idx, values_from = c(city, country), names_glue = "{ifelse(.value=='city','keyword','country')}_{.name}") %>% # 按使用习惯排列列顺序 select(country_election, keyword_1, country_1, keyword_2, country_2, keyword_3, country_3, keyword_4, country_4, keyword_5, country_5) # 2. 生成哑变量:1代表对应country_i和country_election相等,0代表不等 df_final <- df_result %>% mutate(across(starts_with("country_"), ~as.integer(.x == country_election), .names = "dummy_{.col}"))
方法2:for循环实现(符合你最初的循环实现需求)
# 复制原始表作为结果基底 df_result <- df_key # 遍历5个keyword列逐一处理 for (i in 1:5) { kw_col <- paste0("keyword", i) # 匹配对应国家 df_result[[paste0("country_", i)]] <- df_country$country[match(df_result[[kw_col]], df_country$city)] # 生成对应哑变量 df_result[[paste0("dummy_country_", i)]] <- as.integer(df_result[[paste0("country_", i)]] == df_result$country_election) } # 可选:调整列顺序到直观格式 df_result <- df_result[, c("country_election", "keyword1", "country_1", "dummy_country_1", "keyword2", "country_2", "dummy_country_2", "keyword3", "country_3", "dummy_country_3", "keyword4", "country_4", "dummy_country_4", "keyword5", "country_5", "dummy_country_5")]
两种方法输出的结果都包含匹配后的国家列和对应哑变量,可直接使用。
内容的提问来源于stack exchange,提问作者Alberto
相关产品推荐
相关产品推荐

