如何在tidy tibble中高效添加矩阵形式的合并变量
问题:将日期范围内的多变量数据合并为矩阵列到tibble中
需求说明
- 现有
person_data(每行对应一个个体)和value_data(包含日期及多个实验变量) - 需要将
value_data中符合person_data里min_date到date范围的数据,以矩阵变量的形式合并到tidy格式的tibble,避免模糊连接产生多行冗余数据 - 现有方法处理大量变量(如exp1-exp50)时需逐个指定nest变量,操作繁琐,同时希望添加对应的index矩阵列
可复现代码
person_data <- tibble(ID=paste0("ID", 1:50), outcome=sample(0:1, 50, T), date=sample(5:145, 50, F),min_date=date-5) value_data <- tibble(date=seq(1:150), exp1=sample(20:100, 150, T), exp2=sample(20:100, 150, T))
当前尝试的代码(存在冗余问题)
merged <- fuzzyjoin::fuzzy_left_join(person_data, value_data, by=c("date" = "date", "min_date" = "date"), match_fun=c(`>=`,`<=`)) analysis_data <- merged %>% select(-date.y) %>% group_by(ID) %>% nest(exp1=exp1, exp2=exp2)
期望的最终数据结构
fake_data_goal <- tibble(ID=paste0("ID", 1:50), outcome=sample(0:1, 50, T), var=matrix(data=sample(50:100, 50*3, T), nrow=50), index=matrix(rep(c(1:3), 50), nrow=50, byrow=T))
解决方案
使用dplyr逐行处理结合purrr映射,可一次性处理所有实验变量,同时生成index矩阵:
library(dplyr) library(purrr) # 定义函数:根据个体日期范围提取数据并转换为矩阵 extract_exp_matrix <- function(min_d, max_d, value_df) { # 筛选日期范围内的行 filtered <- value_df %>% filter(date >= min_d, date <= max_d) # 提取所有实验变量(排除date)并转置为行矩阵 exp_mat <- filtered %>% select(-date) %>% t() %>% as.matrix() # 生成对应index矩阵 index_mat <- matrix(1:ncol(exp_mat), nrow=1, ncol=ncol(exp_mat)) list(var = exp_mat, index = index_mat) } # 处理主数据集 result <- person_data %>% rowwise() %>% mutate( data_list = list(extract_exp_matrix(min_date, date, value_data)), var = list(data_list$var), index = list(data_list$index) ) %>% select(ID, outcome, var, index) %>% ungroup()
代码说明
extract_exp_matrix函数:自动筛选目标日期范围的数据,将所有实验变量转为行矩阵(每个个体对应一行),同时生成匹配的index序列矩阵- 使用
rowwise()逐行处理个体数据,避免模糊连接产生多行 - 无需逐个指定exp变量,自动识别
value_data中除date外的所有变量,适配大量变量场景 - 最终结果中
var和index均为矩阵列,完全符合期望结构
内容的提问来源于stack exchange,提问作者ktmbiome
相关产品推荐
相关产品推荐

