如何快速检测DataFrame中每个姓名对应的城市是否变化?
检测DataFrame中每个姓名对应的城市是否变化
针对你的大型DataFrame,我们可以通过分组统计每个姓名下的城市唯一值数量,快速判断是否存在城市变化。下面是两种实用的实现方法:
方法1:使用dplyr包(推荐,代码简洁易读)
先加载dplyr包,通过分组计算每个姓名对应的唯一城市信息:
library(dplyr) # 生成包含城市变化情况的统计结果 city_change_check <- df %>% group_by(Name) %>% summarise( 唯一城市数量 = n_distinct(City), 是否有城市变化 = 唯一城市数量 > 1, 去过的城市列表 = paste(unique(City), collapse = ", ") ) # 查看统计结果 print(city_change_check)
运行后会得到一个新表,其中是否有城市变化为TRUE的记录,就是对应姓名出现过城市变更的情况。
方法2:使用Base R(无需额外安装包)
如果不想安装第三方包,用Base R也能实现同样的功能:
# 按姓名分组,统计每个组的唯一城市数量 unique_city_counts <- tapply(df$City, df$Name, function(x) length(unique(x))) # 整理为结构化的结果表 city_change_check_base <- data.frame( Name = names(unique_city_counts), 唯一城市数量 = as.numeric(unique_city_counts), 是否有城市变化 = as.numeric(unique_city_counts) > 1, row.names = NULL ) # 添加去过的城市列表 city_change_check_base$去过的城市列表 <- sapply(split(df$City, df$Name), function(x) paste(unique(x), collapse = ", ")) # 查看结果 print(city_change_check_base)
筛选有城市变化的姓名
如果只需要找出存在城市变化的记录,可以用以下代码:
dplyr版本
changed_names <- city_change_check %>% filter(是否有城市变化) print(changed_names)
Base R版本
changed_names_base <- city_change_check_base[city_change_check_base$是否有城市变化, ] print(changed_names_base)
内容的提问来源于stack exchange,提问作者Jamie
相关产品推荐
相关产品推荐

