如何将R语言中的站点评价计数数据展开为单条评价一行的长表格式
R实现计数统计数据转单行单条记录格式
你目前的rawdata是用cbind生成的字符矩阵,需要先转换为数据框并将计数字段转为数值型,两种实现方案如下:
方案1:使用tidyverse套件(代码更简洁)
专门针对这类计数展开的场景,使用tidyr::uncount函数一步完成行展开:
# 加载依赖包 library(tidyverse) # 1. 转换原始数据格式 rawdf <- rawdata %>% as.data.frame() %>% # 将Rank开头的计数字段从字符转为数值 mutate(across(starts_with("Rank"), ~as.numeric(as.character(.x)))) # 2. 转换为目标格式 newdata <- rawdf %>% # 宽表转长表,提取等级标识 pivot_longer(cols = starts_with("Rank"), names_to = "Rank", names_prefix = "Rank", # 去掉Rank前缀,直接保留A/B/C values_to = "count") %>% # 按计数值展开行,计数为0的行自动剔除 uncount(count)
方案2:纯base R实现(无需额外安装包)
适合不想引入第三方包的场景:
# 1. 转换原始数据格式 rawdf <- as.data.frame(rawdata, stringsAsFactors = FALSE) # 将Rank开头的列转为数值型 rawdf[, grep("^Rank", colnames(rawdf))] <- lapply(rawdf[, grep("^Rank", colnames(rawdf))], function(x) as.numeric(as.character(x))) # 2. 逐站点展开记录 res_list <- lapply(1:nrow(rawdf), function(i) { site_val <- rawdf$site[i] count_vec <- unlist(rawdf[i, grep("^Rank", colnames(rawdf))]) rank_vec <- gsub("^Rank", "", names(count_vec)) data.frame( site = rep(site_val, sum(count_vec)), Rank = rep(rank_vec, count_vec) ) }) # 合并所有站点数据 newdata <- do.call(rbind, res_list)
两种方案最终输出的newdata和你给出的示例结构完全一致,站点a对应4行记录、站点b对应5行记录。
内容的提问来源于stack exchange,提问作者marie
相关产品推荐
相关产品推荐

