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

使用tidyr的gather()函数后丢失数据框行名,如何保留?

保留行名使用tidyr::gather()的方法

问题说明

使用tidyr::gather()将宽格式数据框转为长格式时,原数据框的行名会丢失,例如以下操作后,球员名称行名未出现在结果中:

DF <- as.data.frame((freethrows/Games), row.names = rownames(Games), col.names = colnames(Games))
DF_gathered <- DF %>%
  gather('2005', '2006', '2007', '2008', '2009', '2010', '2011', '2012', '2013', '2014', key = 'year', value = 'freeThrowsPerGame')

解决方案

方法1:先将行名转为数据列,再执行gather

使用tibble::rownames_to_column()将行名转换为数据框的正式列,再调用gather()即可保留该信息:

library(tidyr)
library(tibble)

DF_gathered <- DF %>%
  rownames_to_column(var = "player") %>% # 将行名转为名为player的列
  gather(year, freeThrowsPerGame, `2005`:`2014`) # 批量指定列,简化写法

head(DF_gathered)

执行后结果会包含player列,保留原行名:

player year freeThrowsPerGame
1    KobeBryant 2005          8.700000
2    JoeJohnson 2005          3.182927
3   LeBronJames 2005          7.607595
4 CarmeloAnthony 2005          7.162500
5   DwightHoward 2005          4.341463
6     ChrisBosh 2005          6.771429

方法2:使用tidyr推荐的pivot_longer()(替代gather)

gather()已被tidyr标记为软弃用,官方推荐使用更灵活的pivot_longer(),同样需要先转换行名为列:

library(tidyr)
library(tibble)

DF_gathered <- DF %>%
  rownames_to_column(var = "player") %>%
  pivot_longer(
    cols = `2005`:`2014`, # 指定需要转换的列范围
    names_to = "year",    # 列名对应的新列名
    values_to = "freeThrowsPerGame" # 列值对应的新列名
  )

原理说明

数据框的行名不属于正式的列数据,gather()/pivot_longer()仅处理数据框的列内容,因此必须先将行名转换为数据框的一列,才能在格式转换后保留该信息。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 11:20:37