我有一个交叉乘积超过 .Machine$integer.max
的dcast()
应用程序。 是否有处理这种情况的推荐替代方案? 我可以把w
分成更小的碎片,但希望有一个干净的解决方案。
这可能是将 dcast 应用于大型 data.table 对象时 R 错误的重复,但该问题也没有答案。
谢谢!
library(data.table)
# three million x one thousand
w <- data.table( x = 1:3000000 , y = 1:1000 )
z <- data.table::dcast( w , x ~ y , value.var = 'x' )
# Error in CJ(1:3000000, 1:1000) :
# Cross product of elements provided to CJ() would result in 3e+09 rows which exceeds .Machine$integer.max == 2147483647
我想如果你的一个变量是数字并且你也有分布感,这个解决方案就有效(所以可以把它切成大致相等的部分)
library(data.table)
# three million x one thousand
w <- data.table( x = 1:3000000 , y = 1:1000 )
z <- data.table::dcast( w , x ~ y , value.var = 'x' )
w[ , cast_cat := findInterval( y , seq( 100 , 900 , 100 ) ) ]
w_list <- split( w , by = 'cast_cat' )
w_list <- lapply( w_list , function( x ) x[ , cast_cat := NULL ] )
w_list <- lapply( w_list , function( z ) data.table::dcast( z , x ~ y , value.var = 'x' ) )
result <- Reduce( function( ... ) merge( ... , by = 'x' , all = TRUE ) , w_list )