group_by и создать разреженную матрицу - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь преобразовать некоторые данные в разреженную матрицу.Это выглядит так:

       col1 col2        
  [1,] "5"  "LQEMF0072E"
  [2,] "3"  "KKZZY5914F"
  [3,] "4"  "UTDLY0947T"
  [4,] "4"  "QKGTX6135E"
  [5,] "1"  "FVKVY7432D"
  [6,] "1"  "RXDLC3097S"
  [7,] "1"  "OQZKN5913X"
  [8,] "2"  "XNTHW9334J"
  [9,] "5"  "AHFFZ7845R"

Итак, у меня есть группы:

1 = group1
2 = group2
3 = group3
4 = group4
5 = group5

Я пытаюсь создать разреженную матрицу, которая будет по существу шириной в 100 столбцов (количество наблюдений / слов) иГлубина 5 строк (количество групп).

group1 0 0 0 0 0 1 0 0 0 0 
group2 0 0 1 0 0 0 0 0 0 0
group3 0 0 0 0 0 0 0 0 0 1
etc.

Что-то вроде следующего из пакета rsample у меня не работает.

sparsedat <- dat %>%
  group_by(as.numeric(col1)) %>%
  cast_sparse(col2)

ДАННЫЕ:

names <- c("name1", "name2", "name3", "name4")
    col1 <- sample(1:5, 100, replace = TRUE)

    myFun <- function(n = 5000) {
      a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
      paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
    }
    col2 <- myFun(100)
    col2

    dat <- cbind(col1, col2)
    dat

РЕДАКТИРОВАНИЕ:

Это мой вывод моих данных, где "col1" - это символьный вектор - group1, group2 ... group 5:

Warning message: In storage.mode(from) <- "double" : NAs introduced by coercion

[1,] NA 11 . 21 .  . 16 9 3 3 1 . . 1  5 . 2 1 2 . . 3 . 3 2 2 1 13 . . . . . . .
[2,] NA  3 6  . .  .  . . . . . . . .  1 . . . 1 2 . 4 2 . 3 . .  . . . . . . . .
[3,] NA  . . 20 1 12  2 4 1 . . 3 5 .  . 2 1 . . . 2 . . . . . .  . . . . . . . .
[4,] NA  . .  9 .  .  1 1 2 . 2 . . . 27 2 . . . . . 2 . . . . .  . 2 1 1 3 1 3 3

[1,] ......
[2,] ......
[3,] ......
[4,] ......

NA создаются путем подачи столбца символов в матрицу.Должен ли я их учитывать, а затем заново добавлять строки символов?Я хочу сохранить строки символов, поскольку они помогают идентифицировать идентификатор строк / групп.

РЕДАКТИРОВАТЬ 2: Кажется, что повторяет мою проблему NA:

names <- c("name1", "name2", "name3", "name4")
col1 <- sample(1:5, 100, replace = TRUE)

col1 <- paste("group", col1)

myFun <- function(n = 5000) {
  a <- do.call(paste0, replicate(5, sample(LETTERS, n, TRUE), FALSE))
  paste0(a, sprintf("%04d", sample(9999, n, TRUE)), sample(LETTERS, n, TRUE))
}
col2 <- myFun(100)
col2


dat <- cbind(col1, col2)
dat

dat_sparse <- dat %>% 
  as_tibble() %>%
  count(col1, col2) %>%
  spread(col2, n, fill = 0) %>%
  as.matrix() %>%
  Matrix(., sparse = TRUE)

tail(dat_sparse)

1 Ответ

0 голосов
/ 30 января 2019

Мы можем использовать count и spread.В результате получается data.frame, который вы можете легко преобразовать обратно в матрицу из 1 и 0.

library(tidyverse)

dat %>% 
    as_data_frame() %>%
    count(col1, col2) %>%
    spread(col2, n, fill = 0)

#   col1  AAPMN9343Q AKGAW7022W AMUQA3013Z AYQOG3513J BARTE6056J ...
#   <chr>      <dbl>      <dbl>      <dbl>      <dbl>      <dbl> ...
# 1 1              0          0          0          0          0 ...
# 2 2              1          0          1          1          0 ...
# 3 3              0          0          0          0          0 ...
# 4 4              0          0          0          0          0 ...
# 5 5              0          1          0          0          1 ...

В ответ на ваш дополнительный вопрос вам сначала нужно будет создать матрицу без включенияпервый столбец (это позволяет избежать НС путем принуждения).Затем вы можете добавить имена строк в эту матрицу.

dat_matrix <- as.matrix(dat[,-1]) # exclude first column of character
rownames(dat_matrix) <- dat %>% pull(col1) # add rownames
sparse_dat_matrix <- Matrix::Matrix(dat_matrix, sparse = TRUE) # make sparse

#         AAWYL0013E ABPGV8707B AEMJZ9793B AQTCL9157H ARBYM6583T
# group 1          .          .          .          1          .
# group 2          .          .          1          .          .
# group 3          .          1          .          .          .
# group 4          .          .          .          .          1
# group 5          1          .          .          .          .
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...