如何从R中的两行数据创建一行? (支架示例)

问题描述 投票:-2回答:2

我从一个数据框开始,我们将调用DF1:

Team       Stat1     Stat2     Stat3    Stat4      Pod
Georgia        1         3         3        6        1
Nevada         2         2         2        7        2
Clemson        3         1         2        4        2
Texas          5         4         2        3        1

我想只使用统计1,2,3(不是4)。根据“Pod”中的值,我想创建一个包含两个团队的行。每个团队都有Stats 1,2和3.它应该是这样的:

Team1     Stat1A     Stat2A     Stat3A     Team2     Stat1B     Stat2B     Stat3B
Georgia        1          3         3      Texas          5         4           2
Nevada         2          2         2      Clemson        3         1           2

这应该表明格鲁吉亚和德克萨斯正在互相比赛,内华达和克莱姆森正在比赛,等等。对于锦标赛中的每一轮,我都必须将比赛重新分配给比赛才能进入比赛。所以,在这个非常简化的支架示例中,每个游戏的获胜者都会玩,让我们说格鲁吉亚在决赛中面对克莱姆森来得到这个:

Team1     Stat1A     Stat2A     Stat3A     Team2     Stat1B     Stat2B     Stat3B
Georgia        1          3         3      Clemson        3         1           2
r dplyr
2个回答
0
投票

我们可以使用dcastdata.table

library(data.table)
dcast(setDT(df1[-5]), Pod ~ LETTERS[rowid(Pod)], 
      value.var = names(df1)[1:4], sep="") 
#    Pod   TeamA   TeamB Stat1A Stat1B Stat2A Stat2B Stat3A Stat3B
#1:   1 Georgia   Texas      1      5      3      4      3      2
#2:   2  Nevada Clemson      2      3      2      1      2      2

-1
投票

我们可以使用基数R的聚合:

aggregate(.~Pod,df[-5],I)
  Pod  Team.1  Team.2 Stat1.1 Stat1.2 Stat2.1 Stat2.2 Stat3.1 Stat3.2
1   1 Georgia   Texas       1       5       3       4       3       2
2   2  Nevada Clemson       2       3       2       1       2       2

如果您需要完全匹配,那么:

s=do.call(data.frame,aggregate(.~Pod,df[-5],I))
s[c(grep("\\.1",names(s)),grep("\\.2",names(s)))]
   Team.1 Stat1.1 Stat2.1 Stat3.1  Team.2 Stat1.2 Stat2.2 Stat3.2
1 Georgia       1       3       3   Texas       5       4       2
2  Nevada       2       2       2 Clemson       3       1       2
© www.soinside.com 2019 - 2024. All rights reserved.