Maneiras de ler apenas colunas selecionadas de um arquivo em r? (Um meio feliz entre `leia.table` e` scan`?) [Duplicado
-
25-09-2019 - |
Pergunta
Esta pergunta já tem uma resposta aqui:
- Leia apenas colunas selecionadas 3 respostas
Eu tenho alguns arquivos de dados delimitados muito grandes e Eu quero processar apenas certas colunas em r sem dedicar tempo e memória para criar um data.frame
Para todo o arquivo.
As únicas opções que eu conheço são read.table
o que é muito desperdício quando eu só quero algumas colunas ou scan
O que parece muito baixo para o que eu quero.
Existe uma opção melhor, com r puro ou talvez chamando algum outro script de shell para fazer a extração da coluna e depois usar o scan ou a leitura.table na saída? (O que leva à pergunta como chamar um script de shell e capturar sua saída em r?).
Solução
Às vezes, faço algo assim quando tenho os dados em um arquivo delimitado por Tab:
df <- read.table(pipe("cut -f1,5,28 myFile.txt"))
Isso deixa cut
Faça a seleção de dados, o que pode fazer sem usar muita memória.
Ver Leia apenas o número limitado de colunas para versão r pura, usando "NULL"
no colClasses
argumento para read.table
.
Outras dicas
Uma possibilidade é usar pipe()
em vez do nome do arquivo e ter awk
ou filtros semelhantes extraem apenas as colunas que você deseja.
Ver help(connection)
Para mais informações pipe
e amigos.
Editar: read.table()
Também pode fazer isso por você se você for muito explícito sobre o Colclasses - um valor de nulo para uma determinada coluna pula a coluna Altogether. Ver help(read.table)
. Portanto, temos uma solução na base R sem pacotes ou ferramentas adicionais.
Eu acho que a abordagem de Dirk é direta e rápida. Uma alternativa que eu usei é carregar os dados no sqlite que carregam muito mais rápido que a leitura.table () e depois retirar apenas o que você deseja. O pacote sqldf () facilita tudo isso. Aqui está um link a uma resposta anterior de pilha de pilha que fornece exemplos de código para sqldf ().
Provavelmente isso é mais do que você precisa, mas se você estiver operando muito grande Conjuntos de dados então você também pode dar uma olhada o pacote Hadoopstreaming que fornece uma rotina de redes de mapa usando Hadoop.