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

如何在R中将长格式用户动作DataFrame转换为宽格式(含示例)

在R语言中将长格式DataFrame转换为指定宽格式的方法

嘿,这个需求我太熟悉了!要把你的长格式数据转成每个用户一行、动作按顺序列出来的宽格式,用tidyverse的工具链最直观,我给你一步步演示,你可以直接复制代码运行:

首先,先把你给出的示例数据构造出来,方便测试:

df <- data.frame(
  user = c(1,1,1,2,2,3,4,4),
  actions = c("A","B","C","A","D","B","C","D")
)

方法一:使用tidyverse(推荐,代码可读性高)

先加载tidyverse包(包含dplyr和tidyr,处理数据超方便):

library(tidyverse)

第一步,给每个用户的动作添加一个序号列,用来生成action1、action2这样的列名:

df_with_index <- df %>%
  group_by(user) %>%  # 按user分组
  mutate(action_col = paste0("action", row_number())) %>%  # 给每个组内的动作编序号,拼接成列名
  ungroup()

第二步,用pivot_wider把长格式转成宽格式,自动给动作数不足的用户填充NA:

new_df <- df_with_index %>%
  pivot_wider(
    id_cols = user,  # 保留user作为行标识
    names_from = action_col,  # 用刚才生成的action_col作为新列名
    values_from = actions  # 把actions的值填充到对应列
  )

运行完这两步,new_df就是你想要的结果啦!

方法二:Base R 实现

如果你不想加载额外包,用base R也能搞定,步骤类似:

# 先给每个用户的动作加序号列
df$action_col <- ave(df$actions, df$user, FUN = function(x) paste0("action", seq_along(x)))
# 用reshape函数转宽
new_df_base <- reshape(df, idvar = "user", timevar = "action_col", direction = "wide")
# 去掉列名里多余的"actions."前缀
colnames(new_df_base) <- sub("actions\\.", "", colnames(new_df_base))

方法三:data.table 实现(适合大数据,速度更快)

如果你的数据量很大,推荐用data.table,处理速度比tidyverse快很多:

library(data.table)
setDT(df)  # 把data.frame转成data.table
df[, action_col := paste0("action", seq_len(.N)), by = user]  # 分组加序号列
new_df_dt <- dcast(df, user ~ action_col, value.var = "actions")  # 转宽

核心思路其实很简单:先给每个用户的动作按顺序编号,再根据编号把长格式数据“展开”成宽格式,缺失的位置自然会被填充NA,正好满足你列数等于最大动作数的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:57:05