Распаковать файл gz с помощью R

#r #gzip

#r #gzip

Вопрос:

В прошлом я использовал ?unzip для доступа к содержимому заархивированного файла использование R. На этот раз у меня возникли трудности с извлечением файлов из файла .gz, который можно найти здесь.

Я пробовал ?gzfile и ?gzcon , но не смог заставить его работать. Мы будем признательны за любую помощь, которую вы можете предоставить.

Ответ №1:

Вот отработанный пример, который может помочь проиллюстрировать, для чего предназначены gzfile() и gzcon()

 foo <- data.frame(a=LETTERS[1:3], b=rnorm(3))
foo
#  a        b
#1 A 0.586882
#2 B 0.218608
#3 C 1.290776
write.table(foo, file="/tmp/foo.csv")
system("gzip /tmp/foo.csv")             # being very explicit
  

Теперь, когда файл записан, вместо неявного использования file() , используйте gzfile() :

 read.table(gzfile("/tmp/foo.csv.gz"))   
#  a        b
#1 A 0.586882
#2 B 0.218608
#3 C 1.290776
  

Файл, на который вы указываете, представляет собой сжатый архив tar, и, насколько я знаю, сам R не имеет интерфейса с архивами tar. Они обычно используются для распространения исходного кода — например, для R-пакетов и R-исходников.

Комментарии:

1. возможно ли это сделать с fread{data.table} ? Я пока безуспешно пытался

2. Это очевидно, но бесполезно, поскольку data.table не может использовать этот поток.

3. Это полезно. Его стандартная эвристика пытается выполнить чтение в трех разных местах, что требует прямого / обратного позиционирования, которое вы не можете выполнить в потоке. Однажды я искал службу поддержки freak и, кажется, увидел «нет», но, возможно, это изменилось.

4. Текущая версия data.table фактически поддерживает csv.gz изначально (нет необходимости в zcat )

5. Это должно сработать сейчас ( 9 лет спустя) библиотека (data.table) библиотека (R.utils) d <- fread(«file.gz «,stringsAsFactors = F)

Ответ №2:

Чтобы разархивировать файл в R, вы можете выполнить

 library(R.utils)
gunzip("file.gz", remove=FALSE)
  

или

 gunzip("file.gz")
  

Но тогда вы получаете поведение по умолчанию (remove = TRUE), при котором входной файл удаляется после того, как выходной файл полностью создан и закрыт.

Комментарии:

1. Это то, что я искал. Имейте в виду: NOTE: The default (remove=TRUE) behavior is that the input file is removed after that the output file is fully created and closed. — смотрите ?gunzip

Ответ №3:

Если вы действительно хотите распаковать файл, просто используйте untar функцию, которая поддерживает gzip. Например.:

 untar('chadwick-0.5.3.tar.gz')
  

Ответ №4:

http://blog.revolutionanalytics.com/2009/12/r-tip-save-time-and-space-by-compressing-data-files.html

R добавил прозрачную декомпрессию для определенных типов сжатых файлов в последней версии (2.10). Если ваши файлы сжаты с помощью bzip2, xvz или gzip, их можно прочитать в R, как если бы они были обычными текстовыми файлами. У вас должны быть соответствующие расширения имени файла.

Команда…

 myData <- read.table('myFile.gz')  
  

#сжатые в gzip файлы имеют расширение «gz»

Будет работать так же, как если бы ‘myFile.gz ‘ были необработанным текстовым файлом.

Комментарии:

1. Это работает, если вы не укажете аргумент colClasses. Если вы добавите myData <- read.table(‘myFile.gz ‘, colClasses=c(«символ», «целое число»)) затем вы получите сообщение об ошибке (начиная с версии R 3.2.0). Дерьмо.

Ответ №5:

 library(vroom)
columns3 = c('A', 'B',...) ## define column names
Data1<- vroom(".../XXX.tsv",col_names = columns3)
  

отлично работает с tsv.gz

Ответ №6:

Если это файл, разделенный запятыми / табуляцией, вы можете использовать data.table fread() . Он может обрабатывать архивированные файлы (.zip, .gz):

 fread('myFile.csv.gz')