You need to enable JavaScript to run this app. 如何将R语言中的站点评价计数数据展开为单条评价一行的长表格式
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.08 23:39:00