如何为分组数据添加重复但随组变化的序列列?
解决方案
dplyr + tidyr 实现(基于mutate)
先生成1-3的所有排列,将每个排列与id绑定(超出排列总数时循环重复),再通过匹配condition将排列值映射到对应行:
library(dplyr) library(tidyr) library(gtools) # 生成示例数据 data <- tibble::expand_grid(id = 1:12, condition = c("a", "b", "c")) # 生成所有1-3的排列并转换为长格式 all_perms <- permutations(n = 3, r = 3, v = 1:3) %>% as.data.frame() %>% setNames(c("a", "b", "c")) %>% mutate(perm_group = row_number()) %>% pivot_longer(cols = -perm_group, names_to = "condition", values_to = "order") # 给每个id分配排列组(循环重复排列),并合并数据 result <- data %>% mutate(perm_group = (id - 1) %% nrow(permutations(3, 3, 1:3)) + 1) %>% left_join(all_perms, by = c("perm_group", "condition")) %>% select(-perm_group)
Base R 简洁实现
直接通过索引匹配的方式,给每个id分配排列,再根据condition提取对应排序值:
library(gtools) # 生成示例数据 data <- expand.grid(id = 1:12, condition = c("a", "b", "c"), stringsAsFactors = FALSE) # 生成1-3的所有排列 perms <- permutations(3, 3, 1:3) # 计算每个id对应的排列索引(循环复用排列) perm_index <- ((data$id - 1) %% nrow(perms)) + 1 # 匹配condition对应的排列列位置 cond_index <- match(data$condition, c("a", "b", "c")) # 添加order列 data$order <- perms[cbind(perm_index, cond_index)]
说明
- 1-3的全排列共6种,当
id数量超过6时,会自动循环复用这些排列 - 两种方法都保证每个
id分组内的order是唯一的排列组合,且不同分组的排列依次变化
内容的提问来源于stack exchange,提问作者writer_typer
相关产品推荐
相关产品推荐

