在R中识别数据集里姓名与国家组合的分类数据变化次数
解决R语言中按姓名统计(Name, Country)组合变化次数的问题
嘿,我来帮你搞定这个数据统计需求!核心思路就是按Name分组,统计每个姓名下不同的(Name, Country)组合的数量——这个数量就是你要的“组合变化次数”,比如Smith有2个不同的组合,次数就是2。
下面我给你两种实现方法,分别用dplyr(tidyverse生态,代码更直观)和base R(无需额外装包):
方法1:用dplyr包处理
首先确保你已经安装了dplyr,如果没装的话先运行安装命令:
install.packages("dplyr")
然后按步骤来:
- 构造示例数据集(和你给的示例一致)
- 分组统计每个Name对应的唯一组合数
# 加载dplyr包 library(dplyr) # 创建示例数据 df <- data.frame( Name = c("Smith", "Avin", "Smith", "Robin"), country = c("Canada", "India", "India", "France"), age = c(27, 25, 27, 28), stringsAsFactors = FALSE ) # 统计每个Name的组合变化次数 result <- df %>% group_by(Name) %>% summarize(combination_change_count = n_distinct(country)) # 查看结果 print(result)
运行后你会得到这样的输出:
# A tibble: 3 × 2 Name combination_change_count <chr> <int> 1 Avin 1 2 Robin 1 3 Smith 2
解释一下:同一个Name下,不同的country就对应不同的(Name, country)组合,所以直接用n_distinct(country)统计每个分组里的唯一country数量,就是我们要的组合变化次数,简洁又准确。
方法2:用Base R处理
如果你不想额外安装包,用base R的aggregate函数也能实现:
# 创建示例数据 df <- data.frame( Name = c("Smith", "Avin", "Smith", "Robin"), country = c("Canada", "India", "India", "France"), age = c(27, 25, 27, 28), stringsAsFactors = FALSE ) # 统计每个Name的组合变化次数 result_base <- aggregate(country ~ Name, data = df, FUN = function(x) length(unique(x))) colnames(result_base)[2] <- "combination_change_count" # 查看结果 print(result_base)
输出结果和dplyr方法完全一致:
Name combination_change_count 1 Avin 1 2 Robin 1 3 Smith 2
这里的核心是用function(x) length(unique(x))来统计每个Name分组下country的唯一值数量,完美对应组合变化次数的需求。
内容的提问来源于stack exchange,提问作者Jay
相关产品推荐
相关产品推荐

