Eu tenho um arquivo CSV grande sem uma linha de cabeçalho e o cabeçalho está disponível como um vetor. Quero usar um subconjunto das colunas do arquivo sem carregar o arquivo inteiro. O subconjunto de colunas necessárias é fornecido como uma lista separada.
Editar: neste caso, os nomes das colunas fornecidos na lista de cabeçalho são importantes. Este MRE possui apenas 4 nomes de colunas, mas a solução deve funcionar para um grande conjunto de dados com nomes de colunas pré-especificados. O problema é que os nomes das colunas são fornecidos apenas externamente, não como um cabeçalho no arquivo CSV.
1,2,3,4
5,6,7,8
9,10,11,12
header <- c("A", "B", "C", "D")
subset <- c("D", "B")
Até agora, tenho lido os dados da seguinte maneira, o que me dá o resultado desejado, mas carrego o arquivo inteiro primeiro.
# Setup
library(readr)
write.table(
structure(list(V1 = c(1L, 5L, 9L), V2 = c(2L, 6L, 10L), V3 = c(3L, 7L, 11L), V4 = c(4L, 8L, 12L)), class = "data.frame", row.names = c(NA, -3L)),
file="sample-data.csv",
row.names=FALSE,
col.names=FALSE,
sep=","
)
header <- c("A", "B", "C", "D")
subset <- c("D", "B")
# Current approach
df1 <- read_csv(
"sample-data.csv",
col_names = header
)[subset]
df1
# A tibble: 3 × 2
D B
<dbl> <dbl>
1 4 2
2 8 6
3 12 10
Como posso obter o mesmo resultado sem carregar primeiro o arquivo inteiro?
Perguntas relacionadas
- Somente a leitura de colunas selecionadas inclui o cabeçalho na primeira linha.
- Maneiras de ler apenas colunas selecionadas de um arquivo em R? (Um meio-termo entre
read.table
escan
?) [duplicado] não especifica nomes de colunas fora do arquivo e as respostas não se aplicam a esta situação. - como pular a leitura de certas colunas em readr [duplicado] é diferente porque parece ser sobre pular uma primeira coluna desconhecida e ler uma segunda e terceira colunas conhecidas em vários arquivos. Os tipos de dados não são necessariamente conhecidos antecipadamente nesta questão.
- Existe uma maneira de omitir a primeira coluna ao ler um csv [duplicado] : a coluna é ignorada com base na posição, não na posição em uma lista fornecida externamente de nomes de colunas.
antes da edição do OP sobre o cabeçalho
Você não precisa ler o arquivo inteiro de uma vez, pois há um argumento com a
read_csv()
função. Você só precisaria modificar seu código paraDepois de editar
se você fornecer os argumentos definidos como vetores como na pergunta dos OPs, você precisará seguir a resposta de Darren usando
any_of
ou receberá a mensagem de avisoNota importante:
col_names=
deve ser fornecido um cabeçalho com o comprimento da coluna do arquivo csv ou você receberá o erroVocê pode usar argumentos
readr::read_csv
withcol_names
e .col_select
Se você usar o
read_csv
doreadr
pacote você terá o argumentocol_select
onde poderá selecionar as colunas para ler.A
readr::read_csv()
função possui um argumento chamadocol_select
que permite especificar quais colunas ler usando a mesma linguagem dodplyr::select()
. Então, na prática, isso se parece com:O que então fornece a saída desejada:
Você também pode ligar
attr(df1, "spec")
para confirmar se as colunasA
foramC
ignoradas durante a leitura do arquivo.