[英]Converting Columns to Rows with two summary values in R
我有一個像這樣的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")
,它僅在沒有“ Points”的情況下工作。 當我在其中添加點時,它開始使用_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
有(至少)兩種可能性可以達到期望的結果。
最新版本的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
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)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.