在R中将列转换为具有两个摘要值的行
我有这样一个data.frame:在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
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)