如何在R中将非标准结构的CSV数据转换为规整二维表格
该需求完全可以实现,你可以选择以下两种R方案处理:
方案1:tidyverse 简洁实现
# 加载依赖包 library(tidyverse) # 读取原始CSV为单列数据 raw_data <- read_csv("你的本地文件路径.csv", col_names = "content", show_col_types = FALSE) processed_data <- raw_data %>% # 每两行划为一组,分别对应用户ID行、答案行 mutate(group_id = rep(1:(n()/2), each = 2), type = rep(c("userid", "answers"), n()/2)) %>% # 同组两行转为两列 pivot_wider(names_from = type, values_from = content) %>% # 按反斜杠拆分答案为独立列,自动生成q1~qN的列名 separate(answers, into = paste0("q", 1:70), sep = "\\\\") %>% select(-group_id)
方案2:基础R实现(无需额外安装包)
# 逐行读取原始文件 raw_data <- readLines("你的本地文件路径.csv") # 提取所有用户ID(奇数行) userid <- raw_data[seq(1, length(raw_data), 2)] # 提取所有答案行(偶数行) answer_lines <- raw_data[seq(2, length(raw_data), 2)] # 拆分所有答案行并转为数据框 answer_df <- do.call(rbind, strsplit(answer_lines, "\\\\")) # 设置答案列名 colnames(answer_df) <- paste0("q", 1:ncol(answer_df)) # 合并用户ID和答案得到最终规整表格 processed_data <- cbind(data.frame(userid = userid), answer_df)
注意事项
- R中匹配反斜杠分隔符需要写为
\\\\,因为反斜杠本身是转义字符,需要多重转义才能匹配 - 如果你不确定具体题量,可以把
paste0("q", 1:70)替换为动态取值的代码,自动适配所有题目数量 - 3万条数据量级极小,上述两种方案都不会有性能问题,运行时间在秒级
内容的提问来源于stack exchange,提问作者Caitlyn Arnold
相关产品推荐
相关产品推荐

