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

如何准备并合并经验抽样法(ESM)的日记数据?解决初始调查整合问题

解决方法

你的问题核心是行合并而非列合并——之前用merge是把初始调查的列和日记数据的列横向拼接,这不符合你要把每个参与者的初始调查(time0)和10天日记(time1-10)按行堆叠的需求。下面是两种可行方案:

方案1:用dplyr包(推荐)

假设你的数据结构是:

  • df1:初始调查,每个ID对应1行,包含人口统计变量(如ID, age, gender)
  • daily:日记数据,每个ID对应10行,包含每日测量变量(如ID, mood, sleep),无time列

步骤如下:

  1. 加载dplyr包:
library(dplyr)
  1. 给初始数据添加time列(固定为0):
df1 <- df1 %>% mutate(time = 0)
  1. 给日记数据按ID生成time列(1到10):
# 假设每个ID的日记行是按时间顺序排列的
daily <- daily %>% 
  group_by(ID) %>% 
  mutate(time = row_number()) %>% 
  ungroup()
  1. 行合并两个数据集(自动补充缺失变量为NA):
total_data <- bind_rows(df1, daily) %>% 
  arrange(ID, time)  # 按ID和时间排序

方案2:用base R + plyr包

如果不想用dplyr,可借助plyr的rbind.fill处理变量结构不一致的行合并:

  1. 加载plyr包:
library(plyr)
  1. 给两个数据集加time列:
df1$time <- 0
daily$time <- ave(daily$ID, daily$ID, FUN = function(x) seq_along(x))
  1. 合并数据:
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 10:35:00