如何从现有DataFrame生成包含唯一值计数的新DataFrame
统计DataFrame各列中唯一值的出现次数
方法一:使用tidyverse工具链
这是贴合tidy数据理念的实现方式,步骤清晰易读:
library(tidyverse) # 构造示例数据(替换为你的DataFrame即可) DF <- tibble( column1 = c(0, 0.5, 1, 1, 0, 0, 0, 0.4), column2 = c(0, 0.5, 1, 1, 0, 0.75, 0, 0.4), column3 = c(0.5, 0.5, 0.3, 1, 0.3, 0, 0, 0.4), column4 = c(1, 1, 0.3, 1, 0.3, 0.3, 0, 0.4) ) # 生成目标统计结果 DF_count <- DF %>% # 宽格式转长格式,统一处理所有列的数值 pivot_longer(everything(), names_to = "column", values_to = "value") %>% # 按列名和数值分组,统计出现次数 count(column, value) %>% # 转回宽格式,缺失数值对应的次数填0 pivot_wider(names_from = column, values_from = n, values_fill = 0) %>% # 重命名第一列为要求的名称 rename(column_unique = value) %>% # 按唯一值排序,和示例结果对齐 arrange(column_unique) # 查看结果 DF_count
方法二:使用base R(无需额外包)
如果不想依赖tidyverse,用base R原生函数也能实现:
# 构造示例数据 DF <- data.frame( column1 = c(0, 0.5, 1, 1, 0, 0, 0, 0.4), column2 = c(0, 0.5, 1, 1, 0, 0.75, 0, 0.4), column3 = c(0.5, 0.5, 0.3, 1, 0.3, 0, 0, 0.4), column4 = c(1, 1, 0.3, 1, 0.3, 0.3, 0, 0.4) ) # 获取所有列的唯一值并排序 all_unique_values <- sort(unique(unlist(DF))) # 遍历每一列,统计每个唯一值的出现次数 column_counts <- lapply(DF, function(col) { # 统计当前列的数值频率 freq_table <- table(col) # 匹配所有唯一值,未出现的填0 sapply(all_unique_values, function(val) { ifelse(as.character(val) %in% names(freq_table), freq_table[as.character(val)], 0) }) }) # 组合成目标DataFrame DF_count <- data.frame( column_unique = all_unique_values, do.call(cbind, column_counts) ) # 查看结果 DF_count
内容的提问来源于stack exchange,提问作者Anders Jørgensen
相关产品推荐
相关产品推荐

