Построение матрицы "по частям" в R? - PullRequest
4 голосов
/ 03 ноября 2019

У меня квадратная матрица размером 50k на 50k, сохраненная на диск в текстовом файле, и я хотел бы создать простую гистограмму, чтобы увидеть распределение значений в матрице.

Очевидно, что при попыткепри загрузке матрицы в R с помощью read.table() возникает ошибка памяти, так как матрица слишком велика. Могу ли я в любом случае загружать меньшие подматрицы по одной за раз, но все же вывести гистограмму, которая учитывает все значения исходной матрицы? Я действительно могу загружать меньшие подматрицы, но я просто переопределяю гистограмму, которая была у меня для последней подматрицы, распределением новой.

1 Ответ

3 голосов
/ 03 ноября 2019

Вот подход. У меня нет всех деталей, потому что вы не предоставили пример данных или ожидаемый результат, но один из способов сделать это - использовать функцию read_chunked_csv в пакете readr. Сначала вам нужно написать свою функцию суммирования, а затем применить ее к каждому чанку. Смотрите ниже полный репекс.


# Call the Required Libraries
library(dplyr)
library(ggplot2)
library(readr)

# First Generate Some Fake Data
temp <- tempfile(fileext = ".csv")

fake_dat <- as.data.frame(matrix(rnorm(1000*100), ncol = 100))
write_csv(fake_dat, temp)



# Now write a summarisation function
# This will be applied to each chunk that is read into
# memory
summarise_for_hist <- function(x, pos){
  x %>% 
    mutate(added_bin = cut(V1, breaks = -6:6)) %>% 
    count(added_bin)
}

# Note that I manually set the cutpoints or "breaks"
# argument. You would need to refine this based on your
# data and subject matter expertise

# A

small_read <- read_csv_chunked(temp, # data
                               DataFrameCallback$new(summarise_for_hist),
                               chunk_size = 200 # number of lines to read
                               )

Теперь, когда мы суммировали наши данные, мы можем объединить и построить их.


# Generate our histogram by combining all of the results
# and plotting

small_read %>% 
  group_by(added_bin) %>% 
  summarise(total = sum(n)) %>% 
  ggplot(aes(added_bin, total))+
  geom_col()

Это даст следующее:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...