如何用dplyr根据另一个DataFrame的列数批量创建TIME列
用dplyr动态生成带TIME前缀列的DataFrame
需求说明
基于现有DataFrame(data),用dplyr创建新表,满足:
- 新表行数与
data完全一致 - 保留
data的ID列作为首列 - 其余列以
TIME.为前缀,列数等于data总列数减1(排除ID列);每列值为固定数字,第一列全1,第二列全2,依此类推
示例数据
data <- data.frame(ID=c(1:6), VALUE.1=c(2,5,7,1,3,5), VALUE.2=c(1,7,2,4,5,4), VALUE.3=c(9,2,6,3,4,4), VALUE.4=c(1,2,3,2,3,8))
期望输出
ID TIME.1 TIME.2 TIME.3 TIME.4 1 1 1 2 3 4 2 2 1 2 3 4 3 3 1 2 3 4 4 4 1 2 3 4 5 5 1 2 3 4 6 6 1 2 3 4
当前手动实现的局限
现有手动写法需要硬编码所有TIME.列的名称和重复值,当data列数变化时必须修改代码适配,灵活性很差:
T1 <- data.frame(ID=unique(data$ID), TIME.1=rep(1, length(unique(data$ID))), TIME.2=rep(2, length(unique(data$ID))), TIME.3=rep(3, length(unique(data$ID))), TIME.4=rep(4, length(unique(data$ID))) )
dplyr动态实现方案
以下代码可自动根据data列数生成对应数量的TIME.列,无需手动修改:
library(dplyr) # 计算需要生成的TIME列数量(总列数减去ID列) time_col_num <- ncol(data) - 1 # 生成对应的列名 time_col_names <- paste0("TIME.", 1:time_col_num) # 构建新DataFrame new_df <- data %>% select(ID) %>% mutate(!!!set_names( lapply(1:time_col_num, function(x) rep(x, nrow(.))), time_col_names ))
代码说明
select(ID):提取原表ID列,确保新表行数与原表一致set_names(...):为每个生成的列设置TIME.前缀的名称lapply(...):为每个需要生成的列生成对应重复值,行数自动匹配当前表行数!!!:将命名列表展开为mutate的参数,实现动态添加列
运行代码后,new_df会生成符合需求的结果,且能自动适配data列数的变化。
内容的提问来源于stack exchange,提问作者jeff
相关产品推荐
相关产品推荐

