首页 > 解决方案 > 收集多个列

问题描述

我正在尝试在 R 中收集多个列。一个例子是最近的一些梦幻足球数据:

homeId homePlayerName homePosition homeRosterPts awayId awayPlayerName awayPosition awayRosterPts
5      Nick Chubb           RB         23.3         1   Josh Jacobs         RB           8.9
4      Tyreek Hill          WR         24.6         10   Patrick Mahomes    QB           18.5
7      Davante Adams        WR         21.0         2   Michael Thomas      WR           12.4

我希望 Id、Player Name、Points 和 Positions 列各有一个列,这样我就可以整理数据并将行绑定在一起——而不是在主场和客场重复。我需要在这里使用聚集功能吗?任何解决方案都会有所帮助!

标签: rtidyrtidygather

解决方案


对于乐趣/痛苦/教育,您可以reshape从基础 R 中做到这一点:

reshape(setNames(df, gsub("(home|away)(.*)", "\\2.\\1", names(df))), 
        direction = "long", varying = 1:ncol(df))
#        time Id     PlayerName Position RosterPts id
# 1.home home  5      NickChubb       RB      23.3  1
# 2.home home  4     TyreekHill       WR      24.6  2
# 3.home home  7   DavanteAdams       WR      21.0  3
# 1.away away  1     JoshJacobs       RB       8.9  1
# 2.away away 10 PatrickMahomes       QB      18.5  2
# 3.away away  2  MichaelThomas       WR      12.4  3

您也可以melt像这样使用“data.table”:

library(data.table)
nam <- unique(sub("home|away", "", names(df)))
melt(as.data.table(df), measure = patterns(nam), value.name = nam)
#    variable Id     PlayerName Position RosterPts
# 1:        1  5      NickChubb       RB      23.3
# 2:        1  4     TyreekHill       WR      24.6
# 3:        1  7   DavanteAdams       WR      21.0
# 4:        2  1     JoshJacobs       RB       8.9
# 5:        2 10 PatrickMahomes       QB      18.5
# 6:        2  2  MichaelThomas       WR      12.4

推荐阅读