使用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
相关产品推荐
相关产品推荐

