在R中遍历数据框两列所有行,基于所属向量生成新列的实现方法
解决方案
你可以通过构建国家-大陆映射表快速生成目标列,这种方法简洁且扩展性强;也可以用ifelse直接判断,适合简单场景。以下是具体实现:
先准备示例数据(和你的输入一致)
# 示例数据框 df <- data.frame( Country1 = c("France", "Spain", "Nigeria", "Austria", "Cameroon", "France"), Country2 = c("Austria", "Nigeria", "Italy", "Nigeria", "France", "Spain"), stringsAsFactors = FALSE ) # 大陆向量 Continent_Europe = c("Spain", "Austria", "France", "Italy", "Germany", "Denmark") Continent_Africa = c("Nigeria", "Cameroon", "Botswana", "Angola")
方法1:构建映射表(推荐,扩展性好)
先把两个大陆的国家合并成一个命名向量,键为国家名称,值为对应的大陆:
# 创建国家-大陆映射 continent_map <- c( setNames(rep("Europe", length(Continent_Europe)), Continent_Europe), setNames(rep("Africa", length(Continent_Africa)), Continent_Africa) )
然后直接通过映射生成新列:
# 生成Country1对应的大陆列 df$Country1_Continent <- continent_map[df$Country1] # 生成Country2对应的大陆列 df$Country2_Continent <- continent_map[df$Country2]
方法2:用ifelse直接判断(简单直接)
如果不需要考虑后续扩展,直接用%in%判断国家所属向量:
df$Country1_Continent <- ifelse(df$Country1 %in% Continent_Europe, "Europe", "Africa") df$Country2_Continent <- ifelse(df$Country2 %in% Continent_Europe, "Europe", "Africa")
方法3:tidyverse管道风格(适合dplyr用户)
如果你习惯用dplyr的管道操作:
library(dplyr) df <- df %>% mutate( Country1_Continent = continent_map[Country1], Country2_Continent = continent_map[Country2] )
运行以上任意方法后,你都会得到期望的结果:
Country1 Country2 Country1_Continent Country2_Continent 1 France Austria Europe Europe 2 Spain Nigeria Europe Africa 3 Nigeria Italy Africa Europe 4 Austria Nigeria Europe Africa 5 Cameroon France Africa Europe 6 France Spain Europe Europe
内容的提问来源于stack exchange,提问作者Astral
相关产品推荐
相关产品推荐

