如何用tidyr::expand_grid()复现指定结构的Data数据框?
用tidyr::expand_grid()复现指定结构的数据框
问题分析
你原代码存在以下问题:
- 变量名拼写错误:
oder应为order - 未建立
order、time、task的对应逻辑,导致生成了不符合需求的无效组合(比如s-c顺序下time=1出现complex任务) - 未处理
DV的两个水平(ac/bc),也没生成每个time下恒定的mot值
解决方案代码
library(tidyr) library(dplyr) # 1. 定义class、id、order的固定对应关系 id_info <- tibble( class = rep(1:2, each = 2), id = 1:4, order = rep(c("s-c", "c-s"), 2) ) # 2. 建立order、time、task的映射规则 order_task_map <- tibble( order = rep(c("s-c", "c-s"), each = 2), time = rep(1:2, 2), task = c("simple", "complex", "complex", "simple") ) # 3. 生成每个id-time组合的mot值(同一time下mot恒定) mot_data <- id_info %>% crossing(time = 1:2) %>% mutate(mot = round(runif(n(), 1, 4), 1)) # 4. 组合所有变量生成目标数据框 Data <- id_info %>% left_join(order_task_map, by = "order") %>% left_join(mot_data, by = c("class", "id", "order", "time")) %>% crossing(DV = c("ac", "bc")) %>% select(class, id, order, time, DV, task, mot) %>% arrange(class, id, time, DV) # 查看结果 print(Data)
代码说明
id_info:明确class、id、order的绑定关系,避免生成无意义的组合order_task_map:严格定义不同任务顺序下,时间点对应的任务类型,保证逻辑匹配mot_data:为每个id的每个时间点生成唯一随机值,确保同一时间下mot保持恒定- 最后通过
left_join关联各部分数据,crossing(DV = c("ac", "bc"))生成每个任务下的两个DV水平,再调整列顺序和排序得到目标结构
内容的提问来源于stack exchange,提问作者Simon Harmel
相关产品推荐
相关产品推荐

