如何在R中重构Datacamp上格式异常的阿姆斯特丹大学Dataframe?
重构异常格式的数据框
解决步骤
你的数据框存在两个核心问题:一是仅含一个用点连接的长列名,二是所有数据以分号分隔在同一列中。可以通过以下步骤拆分并重构:
- 拆分数据列:将分号分隔的字符串拆分为独立列
- 提取并拆分列名:从长列名中提取各独立列的名称
- 数据类型转换:将字符型数据转为数值型(适配大部分字段的数值属性)
代码实现(Tidyverse 版本)
# 加载必要包 library(dplyr) library(tidyr) library(stringr) # 1. 拆分数据列:处理空值并生成临时列名 data_clean <- data %>% separate( col = 1, into = paste0("col_", 1:(max(str_count(.[[1]], ";")) + 1)), sep = ";", fill = "right" ) # 2. 提取并拆分原始长列名,得到真实列名 original_colname <- colnames(data)[1] # 使用正则拆分:仅拆分作为列分隔符的点(不拆分列名内部的点,如ST.timing_1) new_colnames <- str_split(original_colname, "\\.(?=[A-Za-z_])")[[1]] # 为新数据框设置列名 colnames(data_clean) <- new_colnames # 3. 将所有列转为数值型 data_clean <- data_clean %>% mutate(across(everything(), as.numeric))
代码实现(Base R 版本)
如果你不想加载额外包,可以用基础R实现:
# 1. 拆分数据为列表,再转为矩阵 data_list <- strsplit(data[[1]], ";") data_matrix <- do.call(rbind, data_list) # 2. 转为数据框 data_clean <- as.data.frame(data_matrix, stringsAsFactors = FALSE) # 3. 拆分并设置列名 original_colname <- colnames(data)[1] new_colnames <- strsplit(original_colname, "\\.(?=[A-Za-z_])")[[1]] colnames(data_clean) <- new_colnames # 4. 转换数据类型为数值型 data_clean[] <- lapply(data_clean, as.numeric)
验证结果
重构完成后,你可以再次运行以下代码验证:
# 查看列名 colnames(data_clean) # 查看前3行数据 head(data_clean, 3) # 计算Finished列的和 sum(data_clean$Finished, na.rm = TRUE)
内容的提问来源于stack exchange,提问作者Edwin
相关产品推荐
相关产品推荐

