gpt4 book ai didi

r - 从长格式到宽格式 reshape 海量数据的有效方法-类似于dcast

转载 作者:行者123 更新时间:2023-12-03 11:43:33 25 4
gpt4 key购买 nike

此问题与创建“宽”表有关,类似于您可以使用reshape2中的dcast创建的表。我知道这已经被讨论过很多次了,但是我的问题与如何使流程更有效率有关。我在下面提供了一些示例,这些示例可能会使问题显得冗长,但其中大多数只是用于基准测试的测试代码

从一个简单的例子开始,

> z <- data.table(col1=c(1,1,2,3,4), col2=c(10,10,20,20,30), 
col3=c(5,2,2.3,2.4,100), col4=c("a","a","b","c","a"))

> z
col1 col2 col3 col4
1: 1 10 5.0 a # col1 = 1, col2 = 10
2: 1 10 2.0 a # col1 = 1, col2 = 10
3: 2 20 2.3 b
4: 3 20 2.4 c
5: 4 30 100.0 a

我们需要创建一个“宽”表,该表将col4列的值作为列名以及col1和col2每种组合的sum(col3)值。
> ulist = unique(z$col4) # These will be the additional column names

# Create long table with sum
> z2 <- z[,list(sumcol=sum(col3)), by='col1,col2,col4']

# Pivot the long table
> z2 <- z2[,as.list((sumcol[match(ulist,col4)])), by=c("col1","col2")]

# Add column names
> setnames(z2[],c("col1","col2",ulist))

> z2
col1 col2 a b c
1: 1 10 7 NA NA # a = 5.0 + 2.0 = 7 corresponding to col1=1, col2=10
2: 2 20 NA 2.3 NA
3: 3 20 NA NA 2.4
4: 4 30 100 NA NA

我的问题是,虽然上述方法适用于较小的表,但实际上不可能在非常大的表上运行它们(除非您可以等待x个小时,否则就可以)。

我认为,这很可能与以下事实有关:数据透视表/宽表的大小比原始表大得多,因为无论是否存在数据透视表,宽表中的每一行都有n个列,它们对应于数据透视表列的唯一值对应于该单元格的任何值(这些是上面的NA值)。因此,新表的大小通常是原始“长”表的2倍以上。

我原来的表有大约5亿行,大约20个唯一值。我试图仅使用500万行来运行上述代码,并且它在R中花费的时间太长(等待完成的时间太长)。

为了进行基准测试,该示例(使用500万行)-使用运行多线程的生产rdbms系统在大约1分钟内完成。使用KDB + / Q( http://www.kx.com)使用单核可在大约8秒内完成。这可能不是一个公平的比较,但是可以感觉到,使用替代方法可以更快地完成这些操作。 KDB +没有稀疏的行,因此它正在为所有单元分配内存,并且比我尝试过的任何其他方法都快得多。

但是,我需要的是R解决方案 :),到目前为止,我还没有找到执行类似操作的有效方法。

如果您有经验并且可以考虑使用其他替代方案/更理想的解决方案,那么我会对了解这一点感兴趣。下面提供了示例代码。您可以更改n的值以模拟结果。枢轴列(列c3)的唯一值已固定为25。
n = 100 # Increase this to benchmark

z <- data.table(c1=sample(1:10000,n,replace=T),
c2=sample(1:100000,n,replace=T),
c3=sample(1:25,n,replace=T),
price=runif(n)*10)

c3.unique <- 1:25

z <- z[,list(sumprice=sum(price)), by='c1,c2,c3'][,as.list((sumprice[match(c3.unique,c3)])), by='c1,c2']
setnames(z[], c("c1","c2",c3.unique))

谢谢,
  • Raj。
  • 最佳答案

    对于n=1e6,下面的操作使用纯dcast大约需要10秒,使用dcast.data.table大约需要4秒:

    library(reshape2)

    dcast(z[, sum(price), by = list(c1, c2, c3)], c1 + c2 ~ c3)

    # or with 1.8.11
    dcast.data.table(z, c1 + c2 ~ c3, fun = sum)

    关于r - 从长格式到宽格式 reshape 海量数据的有效方法-类似于dcast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18802257/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com