R语言按国家分组统计多列中武器系统唯一值总数如何实现
解决方案
方法1:tidyverse实现(可读性高,适配复杂场景)
这是R生态中最常用的实现方式,代码逻辑清晰,无需手动枚举所有武器列:
# 加载依赖包 library(tidyverse) # 统计逻辑 result <- df %>% # 转换为长格式:仅保留国家列,其余非武器列(此处为年份b)直接排除 # 武器列多的时候无需手动列全,用!c(a,b)即可自动识别所有武器列 pivot_longer(cols = !c(a, b), values_to = "weapon") %>% # 按国家分组 group_by(a) %>% # 统计非缺失的唯一武器数量 summarise(weapon_count = n_distinct(weapon, na.rm = TRUE))
运行后输出结果如下:
# A tibble: 3 × 2 a weapon_count <chr> <int> 1 Belgium 4 2 Germany 3 3 Greece 4
完全符合你给出的德国列装3款武器的示例结果。
方法2:base R实现(无需安装第三方包)
如果你不想额外加载依赖包,可以用原生R语法实现:
# 按国家拆分数据集 country_split <- split(df, df$a) # 逐国家统计唯一武器数 count_vec <- sapply(country_split, function(sub_df) { # 提取当前国家所有武器列的取值 all_weapons <- unlist(sub_df[, setdiff(colnames(sub_df), c("a", "b"))]) # 排除缺失值后统计唯一值数量 length(unique(na.omit(all_weapons))) }) # 转为更易读的数据框格式 result <- data.frame( country = names(count_vec), weapon_count = as.integer(count_vec) )
运行结果和方法1完全一致。
内容的提问来源于stack exchange,提问作者Always_learning_new_things
相关产品推荐
相关产品推荐

