如何准备并合并经验抽样法(ESM)的日记数据?解决初始调查整合问题
解决方法
你的问题核心是行合并而非列合并——之前用merge是把初始调查的列和日记数据的列横向拼接,这不符合你要把每个参与者的初始调查(time0)和10天日记(time1-10)按行堆叠的需求。下面是两种可行方案:
方案1:用dplyr包(推荐)
假设你的数据结构是:
df1:初始调查,每个ID对应1行,包含人口统计变量(如ID,age,gender)daily:日记数据,每个ID对应10行,包含每日测量变量(如ID,mood,sleep),无time列
步骤如下:
- 加载dplyr包:
library(dplyr)
- 给初始数据添加
time列(固定为0):
df1 <- df1 %>% mutate(time = 0)
- 给日记数据按ID生成
time列(1到10):
# 假设每个ID的日记行是按时间顺序排列的 daily <- daily %>% group_by(ID) %>% mutate(time = row_number()) %>% ungroup()
- 行合并两个数据集(自动补充缺失变量为NA):
total_data <- bind_rows(df1, daily) %>% arrange(ID, time) # 按ID和时间排序
方案2:用base R + plyr包
如果不想用dplyr,可借助plyr的rbind.fill处理变量结构不一致的行合并:
- 加载plyr包:
library(plyr)
- 给两个数据集加
time列:
df1$time <- 0 daily$time <- ave(daily$ID, daily$ID, FUN = function(x) seq_along(x))
- 合并数据:
total_data <- rbind.fill(df1, daily) total_data <- total_data[order(total_data$ID, total_data$time), ]
特殊情况:日记数据是宽格式
如果你的daily是宽格式(每个ID1行,列名如day1_mood, day2_mood),需要先转成长格式再合并:
library(tidyr) daily_long <- daily %>% pivot_longer( cols = starts_with("day"), # 匹配所有以day开头的列 names_to = "day", values_to = "mood" # 替换为你的日记变量名 ) %>% mutate(time = as.integer(sub("day", "", day))) %>% # 提取时间值 select(-day) # 之后再按方案1的步骤合并df1和daily_long
内容的提问来源于stack exchange,提问作者Shawna
相关产品推荐
相关产品推荐

