как бросить тибл в разреженную матрицу - PullRequest
0 голосов
/ 16 октября 2018

Рассмотрим этот простой тиббл

> data_frame(col1 = c(1,2,3), col2 = c(3,2,NA))
# A tibble: 3 x 2
   col1  col2
  <dbl> <dbl>
1     1     3
2     2     2
3     3    NA

Какой самый эффективный способ разыграть его как разреженную матрицу?Я пробовал что-то вроде

> data_frame(col1 = c(1,2,3), col2 = c(3,2,NA)) %>% 
+   as(., 'sparseMatrix')
Error in as(from, "CsparseMatrix") : 
  no method or default for coercing “tbl_df” to “CsparseMatrix”

, но безуспешно.Попытка как предложено:

y <- purrr::reduce(cbind2, map(df, 'Matrix', sparse = TRUE))

тоже не работает.

Какие-нибудь хорошие идеи, использующие Tidyverse?Спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Это просто перевод награжденного наградами ответа на пост, связанный выше, с базы lapply / Reduce до purrr map / reduce.Предыдущий использованный ответ:

Reduce(cbind2, lapply(x[,-1], Matrix, sparse = TRUE))

Часть того, как это работает, заключается в том, что фреймы данных являются технически списками, поэтому вы можете использовать map для перебора столбцов фрейма данных.В результате получаются две разреженные матрицы, по одной для каждого столбца:

library(dplyr)
library(purrr)

df <- data_frame(col1 = c(1,2,3), col2 = c(3,2,NA))

map(df, Matrix::Matrix, sparse = T)
#> $col1
#> 3 x 1 sparse Matrix of class "dgCMatrix"
#>       
#> [1,] 1
#> [2,] 2
#> [3,] 3
#> 
#> $col2
#> 3 x 1 sparse Matrix of class "dgCMatrix"
#>        
#> [1,]  3
#> [2,]  2
#> [3,] NA

Если затем уменьшить его на cbind2, то получится единственная разреженная матрица.

map(df, Matrix::Matrix, sparse = T) %>% 
  reduce(cbind2)
#> 3 x 2 sparse Matrix of class "dgCMatrix"
#>          
#> [1,] 1  3
#> [2,] 2  2
#> [3,] 3 NA

Создано в 2018-10-16 пакетом представ (v0.2.1)

...