在R中将固定行数的行转列:亚马逊食品评分数据处理
解决亚马逊食品评分数据的格式转换问题
嘿,我来帮你搞定这个数据格式转换的事儿!你的数据框每6行对应一条完整的用户评分信息,现在要把它转成一行6列的宽格式,这样后续筛选操作就方便多了,具体步骤如下:
1. 给每条完整评论生成分组ID
首先我们需要把每6行归为一组,用rep()函数生成分组标识,这样后续才能把同一组的行合并成一行:
# 为每6行生成一个分组ID food_ratings$group_id <- rep(seq_len(nrow(food_ratings) %/% 6), each = 6) # 处理总行数不是6的倍数的情况(如果有的话),把剩余行归到最后一组 if (nrow(food_ratings) %% 6 != 0) { remaining_rows <- nrow(food_ratings) %% 6 food_ratings$group_id <- c(food_ratings$group_id, rep(max(food_ratings$group_id) + 1, remaining_rows)) }
2. 拆分字段名和对应值
你的数据列内容是「字段名: 值」的格式,我们需要把它们拆分成单独的字段列和值列:
# 拆分每行的字段和值,用": "作为分隔符 split_content <- strsplit(food_ratings[[1]], ": ", fixed = TRUE) # 提取字段名和对应值,分别存入新列 food_ratings$field <- sapply(split_content, `[`, 1) food_ratings$value <- sapply(split_content, `[`, 2)
这里用fixed=TRUE是为了避免把冒号当成正则表达式的特殊字符,确保拆分准确。
3. 转换为宽格式数据
用tidyr包的pivot_wider()函数(老版本R可以用spread())把长格式数据转成宽格式,每组变成一行,每个字段对应一列:
# 如果还没安装tidyr包,先执行安装 # install.packages("tidyr") library(tidyr) # 转换为宽格式 wide_food_ratings <- pivot_wider( data = food_ratings, id_cols = group_id, names_from = field, values_from = value )
4. 后续筛选操作示例
转换完成后,你就可以轻松按评分筛选摘要了,比如提取所有5星评分的评论摘要:
# 筛选评分5.0的评论摘要 five_star_summaries <- wide_food_ratings[wide_food_ratings$`review/score` == "5.0", "review/summary"]
如果遇到个别行格式不一致的情况,可以先检查拆分后的field列有没有异常值,再针对性调整拆分逻辑就好啦!
内容的提问来源于stack exchange,提问作者the_stubborn_learner
相关产品推荐
相关产品推荐

