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

R语言长格式转宽格式、重复行扩展为新列的实现方法咨询

R实现分组多行横向展开为宽表的方案

你之前用dcast没生效,核心原因是缺少组内的行标识作为宽表的列名来源,只要先给每个ID+NAME+STATUS分组内的记录加一个序号,再做宽转换即可实现需求。

方案1:tidyverse实现(易读性高)

首先加载依赖包,构造示例数据:

library(tidyverse)

# 构造示例数据
df <- tibble(
  ID = c(1,1,1,2,3,3,3),
  NAME = c("Jack","Jack","Jack","Bill","Steve","Steve","Steve"),
  STATUS = c(1,1,1,2,1,1,1),
  OKR_T = c(34,433,12,34,433,34,45),
  OKR_N = c("OK1","OK2","OK3","OK1","OK2","OK1","OK4"),
  NR = c(0,0,1,1,1,0,0)
)

接下来处理数据:

df_wide <- df %>%
  # 按分组维度分组,生成组内行序号
  group_by(ID, NAME, STATUS) %>%
  mutate(row_num = row_number()) %>%
  ungroup() %>%
  # 宽转换,按行序号生成带后缀的列名
  pivot_wider(
    id_cols = c(ID, NAME, STATUS),
    names_from = row_num,
    values_from = c(OKR_T, OKR_N, NR),
    # 自定义列名规则,用x/y/z作为后缀和你示例的格式完全匹配
    names_glue = "{.value}.{letters[row_num]}"
  )

输出结果和你要求的格式完全一致,缺失值会自动填充为NA,如果需要空值可以后续自行替换。

方案2:data.table实现(性能更高,适合大数据量)

library(data.table)

# 转换为data.table对象
dt <- as.data.table(df)

# 加组内行号+转宽
dt_wide <- dcast(
  dt[, row_num := rowid(ID, NAME, STATUS)],
  ID + NAME + STATUS ~ row_num,
  value.var = c("OKR_T", "OKR_N", "NR"),
  sep = "."
)
# 如果需要把数字后缀换成x/y/z,可以额外改列名:
setnames(dt_wide, old = names(dt_wide)[-(1:3)], 
         new = gsub("(\\.)(\\d)$", function(x) paste0(".", letters[as.integer(substr(x,2,2))]), names(dt_wide)[-(1:3)]))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 23:45:04