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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 21:05:25