如何将dmm包的sheep.df数据集最后三列拆分为带序号的多行?
R语言sheep.df数据集行拆分实现方案
你需要完成的是将每行末尾3个数值拆分为独立行、新增1/2/3序号列的宽转长操作,以下是两种可直接运行的实现方法:
方法1:tidyverse实现(代码简洁易维护)
# 加载依赖包与数据集 library(dmm) library(tidyverse) data(sheep.df) # 执行格式转换 sheep_result <- sheep.df %>% # 将最后3列转为长表,丢弃原有列名 pivot_longer(cols = last_col(2):last_col(), names_to = NULL, values_to = "拆分数值") %>% # 按原行分组生成1/2/3序号 group_by(across(-`拆分数值`)) %>% mutate(序号 = row_number()) %>% ungroup() %>% # 调整列顺序,序号放在最左侧 select(序号, everything())
如果你的数据集列顺序有变动,可将last_col(2):last_col()替换为待拆分的3个列的实际名称,例如c(colA, colB, colC)。
方法2:base R实现(无需额外安装第三方包)
# 加载数据集 library(dmm) data(sheep.df) col_total <- ncol(sheep.df) # 提取不需要拆分的固定列 fixed_part <- sheep.df[, 1:(col_total - 3)] # 提取待拆分的末尾3列 value_part <- sheep.df[, (col_total - 2):col_total] # 固定列每一行重复3次,对应3个拆分值 fixed_repeated <- fixed_part[rep(1:nrow(fixed_part), each = 3), ] # 待拆分数值按行展开为一维向量 value_vector <- as.vector(t(value_part)) # 生成1/2/3循环的序号列 seq_column <- rep(1:3, times = nrow(sheep.df)) # 合并生成最终数据集 sheep_result <- cbind(序号 = seq_column, fixed_repeated, 拆分数值 = value_vector)
转换完成后可运行head(sheep_result, 9)查看前3条原始记录对应的9条转换结果,确认逻辑符合预期。
内容的提问来源于stack exchange,提问作者MelihOrel
相关产品推荐
相关产品推荐

