如何使用R的tidyverse/dplyr计算dataframe两列数值差异及占比
R实现代码(基于tidyverse)
首先加载依赖包:
library(tidyverse)
场景1:按唯一数值统计(统计不同数值的归属)
适合需求中统计「不同数值」的计数和占比的场景:
# 提取两列的唯一值 aug_unique <- unique(`Chun analysis`$Aug) sept_unique <- unique(`Chun analysis`$Sept) # 计算三类数值集合 common_val <- intersect(aug_unique, sept_unique) # 两列共有 aug_only <- setdiff(aug_unique, sept_unique) # Aug列独有 sept_only <- setdiff(sept_unique, aug_unique) # Sept列独有 # 汇总统计结果 total_unique <- length(unique(c(aug_unique, sept_unique))) stat_res <- tibble( 类别 = c("Aug列独有", "Sept列独有", "两列共有"), 数值个数 = c(length(aug_only), length(sept_only), length(common_val)), 占比 = scales::percent(数值个数 / total_unique, accuracy = 0.01) ) # 打印结果 print(stat_res)
基于你提供的样例数据,输出结果为:
| 类别 | 数值个数 | 占比 |
|---|---|---|
| Aug列独有 | 10 | 58.82% |
| Sept列独有 | 1 | 5.88% |
| 两列共有 | 6 | 35.29% |
场景2:按行统计(统计每行数据的归属)
如果需求是统计行数的计数和占比,可以用以下代码:
row_stat_res <- `Chun analysis` %>% mutate( 类别 = case_when( Aug %in% sept_unique & !(Sept %in% aug_unique) ~ "Sept列独有", !(Aug %in% sept_unique) & Sept %in% aug_unique ~ "Aug列独有", TRUE ~ "两列共有" ) ) %>% count(类别, name = "行数") %>% mutate(占比 = scales::percent(行数 / sum(行数), accuracy = 0.01)) # 打印结果 print(row_stat_res)
注意:数据集名
Chun analysis包含空格,R中引用时必须用反引号包裹,否则会报语法错误。
内容的提问来源于stack exchange,提问作者Yomi.blaze93
相关产品推荐
相关产品推荐

