You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 13:50:46