汇总每列使用不同的功能

时间:2018-11-01 17:43:38

标签: r data.table

我有一个data.table与下面的类似,但是有大约300万行和更多的列。

   key1 price qty status category
 1:    1  9.26   3      5        B
 2:    1 14.64   1      5        B
 3:    1 16.66   3      5        A
 4:    1 18.27   1      5        A
 5:    2  2.48   1      7        A
 6:    2  0.15   2      7        C
 7:    2  6.29   1      7        B
 8:    3  7.06   1      2        A
 9:    3 24.42   1      2        A
10:    3  9.16   2      2        C
11:    3 32.21   2      2        B
12:    4 20.00   2      9        B

在这里dput()字符串

dados = structure(list(key1 = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3, 4), 
    price = c(9.26, 14.64, 16.66, 18.27, 2.48, 0.15, 6.29, 7.06, 
    24.42, 9.16, 32.21, 20), qty = c(3, 1, 3, 1, 1, 2, 1, 1, 
    1, 2, 2, 2), status = c(5, 5, 5, 5, 7, 7, 7, 2, 2, 2, 2, 
    9), category = c("B", "B", "A", "A", "A", "C", "B", "A", 
    "A", "C", "B", "B")), .Names = c("key1", "price", "qty", 
"status", "category"), row.names = c(NA, -12L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x0000000004720788>)

我需要转换这些数据,以便每个键都有一个条目,并且在此过程中,我需要创建一些其他变量。到目前为止,我正在使用它:

Mode <- function(x) {
  ux <- unique(x)
  ux[which.max(tabulate(match(x, ux)))]
}


key.aggregate = function(x){
  return(data.table(
    key1 = Mode(x$key1),
    perc.A = sum(x$price[x$category == "A"],na.rm=T)/sum(x$price),
    perc.B = sum(x$price[x$category == "B"],na.rm=T)/sum(x$price),
    perc.C = sum(x$price[x$category == "C"],na.rm=T)/sum(x$price),
    status = Mode(x$status),
    qty = sum(x$qty),
    price = sum(x$price)
  ))
}

new_data = split(dados,by = "key1") #Runs out of RAM here
results = rbindlist(lapply(new_data,key.aggregate))

并期待以下输出:

> results
   key1    perc.A    perc.B     perc.C status qty price
1:    1 0.5937447 0.4062553 0.00000000      5   8 58.83
2:    2 0.2780269 0.7051570 0.01681614      7   4  8.92
3:    3 0.4321208 0.4421414 0.12573782      2   6 72.85
4:    4 0.0000000 1.0000000 0.00000000      9   2 20.00

但是当通过键分割数据时,我总是用光RAM。我尝试只使用三分之一的数据,现在只使用了六分之一,但仍然提供相同的Error: cannot allocate vector of size 593 Kb

我认为这种方法效率很低,这将是获得此结果的最佳方法?

0 个答案:

没有答案