【问题标题】:Creating new column in R dataframe based on existing columns and grouping基于现有列和分组在 R 数据框中创建新列
【发布时间】:2011-10-19 07:25:52
【问题描述】:

我有一个包含这些初始值的足球队信息数据帧 df(按比赛(MATCHID))

 TEAMID Venue LEAGUEPOS MATCHID
 WHU     A         5       1
 COV     H        12       1
 EVE     H        15       2
 MNU     A         2       2
 ARS     A         3       3
 LEI     H         4       3

我希望为每个游戏只创建一行,以便最终看起来像

MATCHID HomeTeam AwayTeam HomePos AwayPos
   1       COV      WHU     12      5      etc.

所以我想创建一些新列,删除其他列并删除重复的行。

我在第一阶段尝试时遇到问题

df$HomeTeam

这会产生

 TEAMID Venue LEAGUEPOS MATCHID HomeTeam
   WHU     A         5       1      COV
   COV     H        12       1      EVE
   EVE     H        15       2      LEI
   MNU     A         2       2      STH
   ARS     A         3       3      TOT
   LEI     H         4       3      WIM

HomeTeam 只显示每个记录的顺序 TEAMID,Venue = H

【问题讨论】:

    标签: r data-manipulation


    【解决方案1】:

    这可以使用作为基础 R 的一部分的函数 reshape 轻松实现。

    # READ DATA
    mydf = read.table(textConnection("
    TEAMID Venue LEAGUEPOS MATCHID
     WHU     A         5       1
     COV     H        12       1
     EVE     H        15       2
     MNU     A         2       2
     ARS     A         3       3
     LEI     H         4       3"), 
     sep = "", header = T, colClasses = rep('character', 4))
    
    # RESHAPE DATA
    reshape(mydf, idvar = 'MATCHID', timevar = 'Venue', direction = 'wide')
    

    这是产生的输出

      MATCHID TEAMID.A LEAGUEPOS.A TEAMID.H LEAGUEPOS.H
    1       1      WHU           5      COV          12
    3       2      MNU           2      EVE          15
    5       3      ARS           3      LEI           4
    

    注意:另一种方法是使用 reshape 包中的 castmelt 函数。

    require(reshape)
    mydf_m = melt(mydf, id = c('MATCHID', 'Venue'))
    cast(mydf_m, MATCHID ~ Venue + variable)
    

    【讨论】:

      【解决方案2】:

      reshape() in base R 做你想做的事,如果有点笨拙的话。这是您的数据:

      con <- textConnection(" TEAMID Venue LEAGUEPOS MATCHID
       WHU     A         5       1
       COV     H        12       1
       EVE     H        15       2
       MNU     A         2       2
       ARS     A         3       3
       LEI     H         4       3
      ")
      dat <- read.table(con, header = TRUE, stringsAsFactors = FALSE)
      close(con)
      

      我们reshape()这个,按要求的顺序获取列,并更新列名:

      newdat <- reshape(dat, direction = "wide", timevar = "Venue", idvar = "MATCHID")
      ## reorder
      newdat <- newdat[, c(1,4,2,5,3)]
      names(newdat) <- c("MatchID","HomeTeam","AwayTeam","HomePos","AwayPos")
      

      这给了我们:

      > newdat
        MatchID HomeTeam AwayTeam HomePos AwayPos
      1       1      COV      WHU      12       5
      3       2      EVE      MNU      15       2
      5       3      LEI      ARS       4       3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 2022-01-25
        • 1970-01-01
        相关资源
        最近更新 更多