在R中将列转换为具有两个摘要值的行

在R中将列转换为具有两个摘要值的行,r,dataframe,dcast,R,Dataframe,Dcast,我有这样一个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 我想把它转换成这样: P Stat V Points 1 Goals 2 10 1 Assis

我有这样一个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
我想把它转换成这样:

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等复制新的列名


谢谢你的帮助。这不是一个学校项目,我只是一个好奇的顾问,试图更新我的统计技能,解决我感兴趣的问题

我们可以做一个
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
有(至少)两种可能达到预期的结果

使用多个value.vars强制转换 最新版本的
data.table
允许将多个
value.var
指定为
dcast()
的参数:

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

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
或合并在一个声明中:

dcast(DT, P ~ Stat, value.var = "V")[DT[, .(Points = sum(Points)), by = P], on = "P"]
代码看起来比第一个变体更简单、简洁

资料
迷人的。最后[]的目的是什么?@sjhuk它只是在屏幕上显示输出对不起-我想我把原来的问题简化了。“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")
setDT(DT)