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

如何在R中为每个玩家运行lm模型并生成新数据框

问题描述

我们有包含玩家ID、游戏时长和得分的数据框,需要为每位玩家拟合回归模型:
ln(score)_t = β₁ + β₂time_playing
最终要生成只包含玩家ID和对应β₂系数的数据框,格式如下:

df
  player       beta_2
1      a  0.005958000
2      b -0.004110000
3      c  0.000390777

数据加载代码及结构如下:

library(tidyverse)
library(broom)

df_players <- read.csv("https://github.com/rhozon/datasets/raw/master/data_test_players.csv", head = TRUE, sep = ";") %>% 
  glimpse()

数据结构:

Rows: 105
Columns: 3
$ player       <chr> "a", "a", "a", ...
$ time_playing <int> 1, 2, 3, ...
$ score        <int> 7, 5, 2, ...

解决方案

可以利用dplyr的分组功能结合broom::tidy()批量处理每个玩家的回归模型,提取所需系数:

# 加载必要包
library(tidyverse)
library(broom)

# 读取数据
df_players <- read.csv("https://github.com/rhozon/datasets/raw/master/data_test_players.csv", head = TRUE, sep = ";")

# 分组拟合模型并提取β₂系数
result_df <- df_players %>%
  group_by(player) %>%
  # 对每组数据拟合回归模型,因变量取score的对数
  do(tidy(lm(log(score) ~ time_playing, data = .))) %>%
  # 筛选出time_playing对应的系数行(即β₂)
  filter(term == "time_playing") %>%
  # 选择需要的列并重命名
  select(player, beta_2 = estimate) %>%
  ungroup()

# 查看结果
print(result_df)

代码说明

  • group_by(player):按玩家ID分组,后续操作针对单个玩家的数据独立执行
  • do(tidy(lm(...))):对每组数据拟合回归模型,并用tidy()将模型结果转换为整洁的数据框格式
  • filter(term == "time_playing"):筛选出自变量time_playing对应的系数行,也就是目标β₂
  • select(player, beta_2 = estimate):保留玩家ID列,将系数值列重命名为beta_2
  • ungroup():取消分组,得到普通格式的结果数据框

运行上述代码后,即可得到符合期望格式的结果。

内容的提问来源于stack exchange,提问作者Rodrigo H. Ozon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 15:20:33