2017-08-08 54 views
2

我有數據,像這樣R數據文件表 - 將分組的列到選擇的數據

dt <- data.table(group = rep(1:3,100), 
      price = rep(1:10, 30), 
      currency = rep(1:2,150) 
      ) 

> dt 
    group price currency 
    1:  1  1  1 
    2:  2  2  2 
    3:  3  3  1 
    4:  1  4  2 
    5:  2  5  1 
---      
296:  2  6  2 
297:  3  7  1 
298:  1  8  2 
299:  2  9  1 
300:  3 10  2 

本質上爲每個組我有一個號碼被在收費價格項目。一些項目的價格在貨幣1和一些貨幣2.我可以很容易地總結營收爲組

dt[, .(varname="total revenue", 
    value = sum(price) 
), 
    by = list(group) 
] 

    group  varname value 
1:  1 total revenue 550 
2:  2 total revenue 550 
3:  3 total revenue 550 

而且我也可以很容易地總結爲組和貨幣

dt[, .(varname="total revenue", 
    value = sum(price) 
), 
    by = list(group,currency) 
    ] 

    group currency  varname value 
1:  1  1 total revenue 250 
2:  2  2 total revenue 300 
3:  3  1 total revenue 250 
4:  1  2 total revenue 300 
5:  2  1 total revenue 250 
6:  3  2 total revenue 300 

但我真的很想擁有一個包含組的數據表,其中包含貨幣名稱和總計值。我可以計算一下我想

dt[, .(varname=paste("total revenue",currency), 
     value = sum(price) 
), 
by = list(group,currency) 
] 

    group currency   varname value 
1:  1  1 total revenue 1 250 
2:  2  2 total revenue 2 300 
3:  3  1 total revenue 1 250 
4:  1  2 total revenue 2 300 
5:  2  1 total revenue 1 250 
6:  3  2 total revenue 2 300 

但最好我想擺脫貨幣列的值現在出現在變量的名稱。我能做到這一點與鏈接像這樣

x <- dt[, .(varname=paste("total revenue",currency), 
     value = sum(price) 
), 
    by = list(group,currency) 
][, currency:=NULL] 

> x 
    group   varname value 
1:  1 total revenue 1 250 
2:  2 total revenue 2 300 
3:  3 total revenue 1 250 
4:  1 total revenue 2 300 
5:  2 total revenue 1 250 
6:  3 total revenue 2 300 

但我不知道這是「正確」的方式與數據表來實現這一點。我也許認爲有一種方法可以用一個命令來完成,即不使用鏈接。我不反對鏈接,只是想知道是否有替代使用data.table語法。

任何意見/建議表示讚賞

回答

2

我沒有看到鏈接問題,但它看起來像我這樣的作品:

dt[, .(value = sum(price) 
), 
by = list(group,varname = paste("total revenue",currency)) 
] 

希望有所幫助!

+0

啊太棒了 - 謝謝。更可讀的海事組織。我專注於選擇的列而不是分組。仍然試圖在SQL上下文中考慮data.table語法,但我認爲我需要突破這一點。 – user7863288

0

任務這樣很容易實現與dplyr包:

library(dplyr) 
dt %>% 
    group_by(group, currency) %>% 
    summarise(total = sum(price)) 

如果insits上重命名價格科拉姆你可以添加其他功能:

%>% mutate(currency = paste('total revenue', currency)) 
+1

他已經有一個工作解決方案,並具體詢問data.table語法...... –

+0

@MarkusN - 確實,我一直在尋找data.table語法,但看到使用dplyr的替代方法很有用。謝謝。 – user7863288