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

如何用pivot_wider按分组添加含唯一值的列?

按id分组生成固定Team列的R数据处理方案

需要对数据框df按id分组,为每组内的唯一Team值生成两个新列Team_1和Team_2——每组的Team_1固定为该组第一个唯一队伍,Team_2固定为第二个唯一队伍,所有行对应填充。

原始数据

id <- c("1", "1", "1", "1", "2", "2", "2", "2")
Team <- c("Team_A", "Team_A", "Team_B", "Team_B", "Team_C", "Team_C", "Team_D", "Team_D")

df <- data.frame(id, Team)

当前输出

id   Team
1  1 Team_A
2  1 Team_A
3  1 Team_B
4  1 Team_B
5  2 Team_C
6  2 Team_C
7  2 Team_D
8  2 Team_D

期望输出

生成包含新列的df代码:

Team_1 <- c("Team_A", "Team_A", "Team_A", "Team_A", "Team_C", "Team_C", "Team_C", "Team_C")
Team_2 <- c("Team_B", "Team_B", "Team_B", "Team_B", "Team_D", "Team_D", "Team_D", "Team_D")

df <- data.frame(id, Team, Team_1, Team_2)

对应的数据框结果:

id   Team Team_1 Team_2
1  1 Team_A Team_A Team_B
2  1 Team_A Team_A Team_B
3  1 Team_B Team_A Team_B
4  1 Team_B Team_A Team_B
5  2 Team_C Team_C Team_D
6  2 Team_C Team_C Team_D
7  2 Team_D Team_C Team_D
8  2 Team_D Team_C Team_D

遇到的问题

尝试使用pivot_wider和spread函数时,出现报错:

Values from Team are not uniquely identified; output will contain list-cols.
中文翻译:Team的值无法唯一标识;输出将包含列表列。

解决方案

方法一:dplyr分组直接赋值

利用dplyr分组后,提取每组的唯一Team值,直接赋值给新列:

library(dplyr)

df <- df %>%
  group_by(id) %>%
  mutate(
    Team_1 = first(unique(Team)),
    Team_2 = last(unique(Team))
  ) %>%
  ungroup()

方法二:先做映射表再合并

先创建每个id对应的唯一Team映射表,再合并回原数据:

library(dplyr)
library(tidyr)

# 生成分组映射表
team_map <- df %>%
  distinct(id, Team) %>%
  group_by(id) %>%
  mutate(team_col = paste0("Team_", row_number())) %>%
  pivot_wider(names_from = team_col, values_from = Team)

# 合并到原数据框
df <- df %>% left_join(team_map, by = "id")

报错原因说明

之前用pivot_wider报错,是因为原数据中每个id对应多个重复的Team值,函数无法确定如何将重复值转换为宽格式列,因此提示生成列表列。只要先提取每组的唯一Team值,再进行宽格式转换或直接赋值,就能解决问题。

内容的提问来源于stack exchange,提问作者Michael

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 04:10:19