2017-08-08 52 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