R语言数据转换:基于不同列数值生成新行的实现方法
R数据框按计数展开为逐行评分记录解决方案
方法1:tidyverse 实现(简洁易读)
搭配tidyr的pivot_longer和uncount函数即可实现需求,uncount专门用于按计数列重复生成对应行数:
# 加载依赖包 library(tidyr) library(dplyr) # 构造原始数据 item <- c('A','B','C') one <- c(2, 1, 2) two <- c(1,1,2) data <- data.frame(item,one,two) # 转换逻辑 result <- data %>% # 宽表转长表,拆分评分类型和对应计数 pivot_longer(cols = c(one, two), names_to = "rating", values_to = "count") %>% # 将评分标识转为对应数值 mutate(rating = ifelse(rating == "one", 1, 2)) %>% # 按计数值重复行数,自动删除计数列 uncount(count)
方法2:base R 实现(无需安装额外包)
直接使用基础函数rep和mapply完成转换:
# 构造原始数据 item <- c('A','B','C') one <- c(2, 1, 2) two <- c(1,1,2) data <- data.frame(item,one,two) # 逐列构造结果 item_col <- rep(data$item, rowSums(data[,c("one", "two")])) rating_col <- unlist(mapply(function(o, t) rep(c(1,2), c(o,t)), data$one, data$two)) result <- data.frame(item = item_col, rating = rating_col)
两种方法输出的结果均与期望格式完全一致。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

