如何为数据框df的每个日期重复所有63个名称?
嗨,看来你需要生成日期和名称的全组合(笛卡尔积)——也就是让每个日期都对应列表里的63个名称对吧?我来给你几个简洁靠谱的方案,顺便帮你修正下你提到的思路里的小问题~
方法1:用tidyr的crossing()(推荐,代码最简洁)
如果你习惯用tidyverse工具链,tidyr::crossing()是最省心的选择,它会自动生成两个向量的所有配对组合,还能保留原变量类型:
library(tidyr) # 假设你的日期列是df$Date,名称列表叫name_list(建议别用name当变量名,和base R的函数重名) result_df <- crossing(Date = df$Date, Name = name_list)
最终结果的行数正好是 3000 * 63 = 189000,每个日期都和所有名称一一配对,而且日期的格式会完整保留,不用来回转字符。
方法2:基础R的expand.grid()
要是不想加载额外包,基础R自带的expand.grid()也能搞定,只是需要多一步日期格式的还原:
# 生成全组合,stringsAsFactors=FALSE避免名称被转成因子 result_df <- expand.grid(Date = df$Date, Name = name_list, stringsAsFactors = FALSE) # 因为expand.grid会把日期转成数值(自1970-01-01以来的天数),所以转回去 result_df$Date <- as.Date(result_df$Date, origin = "1970-01-01")
修正你自己的思路
你原来的代码方向是对的,但配对逻辑需要调整:你需要把每个日期连续重复63次,同时把整个名称列表重复3000次,这样才能一一对应:
# 每个日期重复63次(对应63个名称) date_vec <- rep(df$Date, each = length(name_list)) # 名称列表重复3000次(对应3000个日期) name_vec <- rep(name_list, times = nrow(df)) # 组合成数据框 result_df <- data.frame(Date = date_vec, Name = name_vec)
这样写出来的结果和前面两种方法完全一致,而且逻辑更贴合你最初的想法。
小提醒
- 尽量别把日期转成字符类型,保持Date类的格式会让后续的时间操作(比如按月份筛选、计算间隔)方便很多。
- 如果你的名称列表是因子类型,记得先转成字符(
as.character(name_list)),避免后续出现不必要的因子问题。
内容的提问来源于stack exchange,提问作者NColl
相关产品推荐
相关产品推荐

