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

如何在R中按规则清洗Excel导入的结构化数据集

R数据清洗:重构Excel导入的不规则数据集

针对你提供的不规则结构数据集,我们可以分步骤完成列名重构、行数据整理,最终得到目标的df1和df2:

步骤1:定义列名映射与分组

首先明确人口统计列的正确名称(来自原数据第二行),以及题目列的新命名规则:

# 加载原数据
df <- data.frame(Text1 = c(NA, "Name","Jack","Jack"),
                 Text2 = c(NA, "District","Leon","Leon"),
                 Text3 = c(NA, "School","Black","Black"),
                 Text4 = c(NA, "Grade",1,1),
                 Scoring = c("Text", "Teacher","Ana","Ana"),
                 Item1 = c("11_ada", "/a/","1.0","0.0"),
                 Text7 = c(NA, "/c/","1.0","1.0"),
                 Text8 = c(NA, "/a/","1.0","1.0"),
                 Item2 = c("10_bada", "/x/","1.0","0.0"),
                 Text10 = c(NA, "/y/","0.0","1.0"),
                 Text11 = c(NA, "/z/","1.0","0.0"))

# 提取人口统计列的正式名称(取自原数据第二行)
demo_cols <- c("Text1", "Text2", "Text3", "Text4", "Scoring")
demo_col_names <- as.character(df[2, demo_cols])

# 定义题目列的新名称
item_col_names <- c("1.1", "1.2", "1.3", "2.1", "2.2", "2.3")

# 合并得到完整的目标列名
full_col_names <- c(demo_col_names, item_col_names)

步骤2:构建包含Item标识行的df2

先整理Item标识行、有效作答行的数据,再合并:

# 构建Item标识行:人口统计列填NA,题目列重复对应Item的标识
item_id_row <- c(
  rep(NA, length(demo_col_names)),
  rep(df[1, "Item1"], 3),  # 1.1-1.3对应Item1的标识
  rep(df[1, "Item2"], 3)   # 2.1-2.3对应Item2的标识
)

# 提取有效作答行的人口统计数据
demo_responses <- df[3:4, demo_cols]

# 提取有效作答行的题目数据
item_responses <- df[3:4, c("Item1", "Text7", "Text8", "Item2", "Text10", "Text11")]

# 合并所有行并设置列名
df2 <- data.frame(
  rbind(item_id_row, demo_responses, item_responses),
  stringsAsFactors = FALSE
)
colnames(df2) <- full_col_names

# 转换作答列类型:把"1.0"/"0.0"转为数值,保留Item标识字符串
df2[, item_col_names] <- lapply(df2[, item_col_names], function(x) {
  ifelse(x %in% c("1.0", "0.0"), as.numeric(x), x)
})

# 转换Grade列为数值型
df2$Grade <- as.numeric(df2$Grade)

步骤3:构建仅保留有效作答行的df1

只需移除df2的第一行(Item标识行)即可:

df1 <- df2[-1, ]

验证结果

df1输出:

print(df1)
#>    Name District School Grade Teacher 1.1 1.2 1.3 2.1 2.2 2.3
#> 2  Jack     Leon  Black     1     Ana 1.0 1.0 1.0 1.0 0.0 1.0
#> 3  Jack     Leon  Black     1     Ana 0.0 1.0 1.0 0.0 1.0 0.0

df2输出:

print(df2)
#>    Name District School Grade Teacher     1.1     1.2     1.3      2.1      2.2      2.3
#> 1  <NA>     <NA>   <NA>    NA    <NA> 11_ada 11_ada 11_ada 10_bada 10_bada 10_bada
#> 2  Jack     Leon  Black     1     Ana    1.0    1.0    1.0     1.0     0.0     1.0
#> 3  Jack     Leon  Black     1     Ana    0.0    1.0    1.0     0.0     1.0     0.0

内容的提问来源于stack exchange,提问作者amisos55

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 16:15:43