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

如何为分组数据添加重复但随组变化的序列列?

解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:25:34