在R中统计任意两列中各值出现的行数
解决方法
要统计每个值出现在多少不同行中(同一行内重复值只算一次),你可以用dplyr结合tidyr来处理,核心思路是先转换数据格式,再去重计数:
library(dplyr) library(tidyr) data <- read.csv(text = "foo,bar a,b a,a b,c c,a c,b") result <- data %>% # 给每行添加唯一标识,用于区分不同行 mutate(row_id = row_number()) %>% # 将宽格式转为长格式,把两列的数值合并到同一列 pivot_longer(cols = c(foo, bar), names_to = "col", values_to = "Value") %>% # 同一行内的相同值只保留一条,避免重复计数 distinct(row_id, Value) %>% # 统计每个值对应的行数 count(Value, name = "Count") print(result)
运行后输出:
# A tibble: 3 × 2 Value Count <chr> <int> 1 a 3 2 b 3 3 c 3
关键步骤说明
mutate(row_id = row_number()):生成每行的唯一ID,用来追踪每个值所属的原始行。pivot_longer:把原来的两列数据整合为一列,让每个值都和对应的行ID关联。distinct(row_id, Value):去除同一行内重复的数值,确保一行不管有多少个相同值,都只被计数一次。count(Value, name = "Count"):按值分组,统计每个值对应的唯一行的数量。
如果不用tidyverse,也可以用基础R实现:
# 基础R方案 # 提取每行的唯一值 row_unique_vals <- apply(data, 1, unique) # 展开并统计每个值出现的行数 count_table <- table(unlist(row_unique_vals)) # 转换为数据框 as.data.frame(count_table, responseName = "Count")
内容的提问来源于stack exchange,提问作者jjmerelo
相关产品推荐
相关产品推荐

