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

基于DataFrame关联与新变量创建的R语言数据处理需求

实现基于日期匹配的R语言数据转换

现有数据

Data 1

df_1 <- data.frame(date = as.Date(c("2022-10-27","2022-07-28", "2022-04-28")))
df_1

Data 2

df_2 <- data.frame(date = as.Date(c("2022-09-12","2022-06-13", "2022-03-15","2022-01-15","2021-10-21")), ratio = c(2.12,4.43,1.23,9.89,7.50))
df_2

期望输出

df_3 <- data.frame(date = as.Date(c("2022-10-27","2022-07-28", "2022-04-28" )), 
                   ratio_past_1 =c(2.12,4.43,1.23), 
                   ratio_past_2 = c(4.43,1.23,9.89), 
                   ratio_past_3 = c(1.23,9.89,7.50),
                   ratio_past_4 = c(9.89,7.50,NA), 
                   ratio_past_5 = c(7.50,NA,NA))
df_3

已知条件

  • df_1中的日期两两对比均大于df_2中的对应日期
  • df_1的date_i与df_2的date_i属于同一周期

需求

  • 将df_1的日期作为df_3的date列
  • 根据df_2中早于df_1对应日期的ratio观测值创建新变量

解决方案

方法1:基础R实现

通过构造偏移矩阵直接生成目标列,逻辑简洁高效:

# 提取df_2的ratio向量
ratio_vec <- df_2$ratio
# 确定需要生成的列数
n_cols <- length(ratio_vec)
# 构造带偏移的ratio矩阵,不足部分补NA
ratio_matrix <- sapply(1:n_cols, function(x) {
  c(ratio_vec[x:length(ratio_vec)], rep(NA, x-1))
})[1:nrow(df_1), ]
# 合并df_1和矩阵,设置列名
df_3 <- cbind(df_1, setNames(as.data.frame(ratio_matrix), paste0("ratio_past_", 1:n_cols)))

方法2:dplyr + tidyr实现

通过交叉连接+筛选+转宽的方式,更易理解逻辑:

library(dplyr)
library(tidyr)

# 为两个数据集添加索引,用于匹配周期关系
df_1 <- df_1 %>% mutate(row_id = row_number())
df_2 <- df_2 %>% mutate(offset_id = row_number())

# 交叉连接后筛选符合周期的记录,再转宽格式
df_3 <- df_1 %>%
  cross_join(df_2) %>%
  filter(offset_id <= row_id + nrow(df_2) - nrow(df_1)) %>%
  mutate(col_name = paste0("ratio_past_", offset_id)) %>%
  pivot_wider(id_cols = c(date, row_id), names_from = col_name, values_from = ratio) %>%
  select(-row_id) %>%
  arrange(date)

内容的提问来源于stack exchange,提问作者Philipp Neuber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 02:28:31