r data.table :: dcast кросс-продукт не работает на большом наборе данных - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть приложение dcast(), чей перекрестный продукт превышает .Machine$integer.max.Есть ли рекомендуемая альтернатива решению этой ситуации?я мог бы разбить w на более мелкие части, но надеялся на чистое решение.

это может быть дубликатом ошибки R при применении dcast к большому объекту data.table , нона этот вопрос также нет ответа.

спасибо!

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

1 Ответ

0 голосов
/ 02 февраля 2019

Полагаю, это решение работает, если одна из ваших переменных числовая, и у вас также есть смысл распределения (поэтому можно разрезать его примерно на равные части)

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 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...