R语言中非结构化数据集的批量重塑方法咨询
数据集批量重塑与清洗实现方案
原始数据集
data <- data.frame(var1 = c("Text","A","B","C","D"), var2 = c("Text",NA, 1,0,1), var3 = c("112-1",NA,NA,"text",NA), var4 = c("Text",1,0,NA, NA), var5 = c("113-1",NA,"text",NA,NA))
数据结构说明:
var1第2行及以下为项目名称(A/B/C/D)- 首行值为
Text的列(如var2、var4)是分数列,存储对应项目的分数,非数值标记(如text)需转为NA - 首行值为
xxx-1格式的列(如var3、var5)是ID列,首行是分组ID,其余行的非NA值为无效标记,需转为NA
通用实现代码
# 提取项目名称(var1第2行至末尾) items <- data$var1[-1] # 自动区分分数列和ID列:首行是"Text"的为分数列,其余为ID列 score_cols <- names(data)[data[1,] == "Text"] id_cols <- setdiff(names(data), c("var1", score_cols)) # 批量处理ID列:提取ID值、清理无效标记、匹配对应分数 id_data <- lapply(id_cols, function(col) { # 提取首行ID,移除末尾的"-1"(可根据实际ID格式调整正则) id <- sub("-1$", "", data[1, col]) # 提取对应分数列的分数值,清理非数值内容 score_col <- score_cols[which(id_cols == col) + 0] # 分数列与ID列一一对应 scores <- data[-1, score_col] scores <- ifelse(scores == "text" | is.na(scores), NA, as.numeric(scores)) # 组合成单行数据 data.frame(id = id, t(scores)) }) # 合并所有处理后的ID数据 result <- do.call(rbind, id_data) # 设置项目名称为列名 colnames(result)[-1] <- items # 查看最终结果 result
运行结果
id A B C D 1 112 NA 1 0 1 2 113 1 0 NA NA
代码适配说明
- 自动识别分数列与ID列,无需手动指定列名,可直接适配更多同模式列(如var6、var7等)
- ID值处理逻辑可通过调整正则表达式
sub("-1$", "", ...)适配不同ID格式 - 自动清理所有非数值标记(如
text),统一转为NA并转为数值型
内容的提问来源于stack exchange,提问作者amisos55
相关产品推荐
相关产品推荐

