【问题标题】:Converting Columns to Rows with two summary values in R在R中将列转换为具有两个汇总值的行
【发布时间】:2017-01-25 10:44:41
【问题描述】:

我有一个这样的data.frame:

P   Stat    V   Points
1   Goals   2   10
1   Assists 1   3
2   Goals   1   5
2   Assists 1   3

我想把它转换成这样的:

P   Goals   Assists Points
1   2       1       13
2   1       1       8

目前我使用的是dcast,如下:

dcast(stats, P ~ Stat, value.var = "V"),它在没有“点”的情况下工作。当我添加点时,它开始使用 _1、_2 等复制新列名称。

任何帮助表示赞赏。这不是一个学校项目,我只是一个好奇的顾问,试图在我感兴趣的问题上更新我的统计技能!

【问题讨论】:

    标签: r dataframe dcast


    【解决方案1】:

    我们可以做一个dcast 然后添加“点”列

    library(data.table)
    dcast(setDT(d1), P~Stat, value.var = "V")[, Points := sum(d1$Points)][]
    #     P Assists Goals Points
    #1: 1       1     2     13
    

    【讨论】:

    • 令人着迷。最后 [ ] 的作用是什么?
    • @sjhuk 只是为了在屏幕上显示输出
    • 对不起 - 我想我过度简化了最初的问题。 “P”可以有多个值,因此“点”列不能只是点的总和
    【解决方案2】:

    有(至少)两种可能性可以达到预期的结果。

    使用多个 value.vars 进行强制转换

    data.table 的最新版本允许指定多个value.var 作为dcast() 的参数:

    library(data.table)   # version 1.10.4 used
    dcast(DT, P ~ Stat, value.var = list("V", "Points"))
    #   P V_Assists V_Goals Points_Assists Points_Goals
    #1: 1         1       2              3           10
    #2: 2         1       1              3            5
    

    如果只需要一个Points 列,则需要添加点并删​​除不必要的列。通过链接,这可以在一个语句中完成,但不是很简洁。

    dcast(DT, P ~ Stat, value.var = list("V", "Points"))[
      , Points := Points_Assists + Points_Goals][
        , c("Points_Assists", "Points_Goals") := NULL][]
    #   P V_Assists V_Goals Points
    #1: 1         1       2     13
    #2: 2         1       1      8
    

    投射并加入

    或者,V 的 dcast 和点的聚合可以在单独的步骤中完成,然后将结果连接起来:

    # dcast
    temp1 <- dcast(DT, P ~ Stat, value.var = "V")
    temp1
    #   P Assists Goals
    #1: 1       1     2
    #2: 2       1     1
    
    # sum points by P
    temp2 <- DT[, .(Points = sum(Points)), by = P]
    temp2
    #   P Points
    #1: 1     13
    #2: 2      8
    

    现在需要连接两个结果:

    temp1[temp2, on = "P"]
    #   P Assists Goals Points
    #1: 1       1     2     13
    #2: 2       1     1      8
    

    或合并在一个语句中:

    dcast(DT, P ~ Stat, value.var = "V")[DT[, .(Points = sum(Points)), by = P], on = "P"]
    

    代码看起来比第一个变体更直接和简洁。

    数据

    library(data.table)
    DT <- fread(
      "P   Stat    V   Points
      1   Goals   2   10
      1   Assists 1   3
      2   Goals   1   5
      2   Assists 1   3")
    

    注意fread() 默认返回一个 data.table 对象。如果DT 仍然是一个data.frame,则需要将其强制转换为data.table

    setDT(DT) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-27
      • 1970-01-01
      相关资源
      最近更新 更多