Como faço para fazer uma lista de quadros de dados e como faço para acessar cada um desses quadros da lista?
Por exemplo, como posso colocar esses quadros de dados em uma lista?
d1 <- data.frame(y1 = c(1, 2, 3),
y2 = c(4, 5, 6))
d2 <- data.frame(y1 = c(3, 2, 1),
y2 = c(6, 5, 4))
=
não por<-
dentrodata.frame()
. Usando<-
você criay1
ey2
em seu ambiente global e seu quadro de dados não é o que você deseja que seja.<-
es dentro de data.frame (). Que novidade eu era.Respostas:
Isso não está relacionado à sua pergunta, mas você deseja usar
=
e não<-
dentro da chamada de função. Se você usar<-
, acabará criando variáveisy1
ey2
em qualquer ambiente em que estiver trabalhando:Isso não terá o efeito aparentemente desejado de criar nomes de colunas no quadro de dados:
O
=
operador, por outro lado, associará seus vetores a argumentos paradata.frame
.Quanto à sua pergunta, é fácil fazer uma lista de quadros de dados:
Você acessa os quadros de dados da mesma maneira que acessaria qualquer outro elemento da lista:
fonte
As outras respostas mostrar-lhe como fazer uma lista de data.frames quando você já tem um monte de data.frames, por exemplo,
d1
,d2
, .... Ter quadros de dados sequencialmente nomeado é um problema, e colocá-los em uma lista é um boa correção, mas a melhor prática é evitar ter um monte de dados. quadros que não estão em uma lista em primeiro lugar.As outras respostas fornecem muitos detalhes de como atribuir quadros de dados a elementos de lista, acessá-los etc. Também abordaremos um pouco aqui, mas o ponto principal é dizer: não espere até que você tenha um monte de
data.frames
para adicioná-los a uma lista. Comece com a lista.O restante desta resposta abordará alguns casos comuns em que você pode ser tentado a criar variáveis seqüenciais e mostra como ir direto para as listas. Se você é novo nas listas em R, também pode ler Qual é a diferença entre
[[
e[
ao acessar elementos de uma lista? .Listas desde o início
Nunca crie
d1
d2
d3
, ...,dn
em primeiro lugar. Crie uma listad
comn
elementos.Lendo vários arquivos em uma lista de quadros de dados
Isso é feito com bastante facilidade ao ler arquivos. Talvez você tenha arquivos
data1.csv, data2.csv, ...
em um diretório. Seu objetivo é uma lista de data.frames chamadamydata
. A primeira coisa que você precisa é de um vetor com todos os nomes de arquivo. Você pode construir isso com pasta (por exemplo,my_files = paste0("data", 1:5, ".csv")
), mas é provavelmente mais fácil de usarlist.files
para pegar todos os arquivos apropriados:my_files <- list.files(pattern = "\\.csv$")
. Você pode usar expressões regulares para corresponder aos arquivos. Leia mais sobre expressões regulares em outras perguntas, se precisar de ajuda. Dessa forma, você pode pegar todos os arquivos CSV, mesmo que eles não sigam um bom esquema de nomenclatura. Ou você pode usar um padrão regex mais sofisticado, se precisar escolher certos arquivos CSV dentre vários deles.Neste ponto, a maioria dos iniciantes de R usará um
for
loop, e não há nada de errado nisso, ele funciona muito bem.Uma maneira mais R-like de fazer isso é
lapply
, que é um atalho para o acimaObviamente, substitua por outras funções de importação de dados
read.csv
conforme apropriado.readr::read_csv
oudata.table::fread
será mais rápido, ou você também pode precisar de uma função diferente para um tipo de arquivo diferente.De qualquer forma, é útil nomear os elementos da lista para corresponder aos arquivos
Dividindo um quadro de dados em uma lista de quadros de dados
Isso é super fácil, a função base
split()
faz isso por você. Você pode dividir por uma coluna (ou colunas) dos dados ou por qualquer outra coisa que desejarEssa também é uma boa maneira de dividir um quadro de dados em partes para validação cruzada. Talvez você queira dividir
mtcars
em partes de treinamento, teste e validação.Simulando uma lista de quadros de dados
Talvez você esteja simulando dados, algo como isto:
Mas quem faz apenas uma simulação? Você quer fazer isso 100 vezes, 1000 vezes, mais! Mas você não deseja 10.000 quadros de dados em seu espaço de trabalho. Use
replicate
e coloque-os em uma lista:Nesse caso, especialmente, você também deve considerar se realmente precisa de quadros de dados separados ou um único quadro de dados com uma coluna "grupo" funcionaria da mesma maneira? Usando
data.table
oudplyr
é muito fácil fazer as coisas "por grupo" em um quadro de dados.Não coloquei meus dados em uma lista :( farei da próxima vez, mas o que posso fazer agora?
Se eles são uma variedade ímpar (o que é incomum), você pode simplesmente atribuí-los:
Se você tem quadros de dados nomeados em um padrão, por exemplo,
df1
,df2
,df3
, e você quer que eles em uma lista, você podeget
lhes se você pode escrever uma expressão regular para coincidir com os nomes. Algo comoGeralmente,
mget
é usado para obter vários objetos e retorná-los em uma lista nomeada. Sua contraparteget
é usada para obter um único objeto e devolvê-lo (não em uma lista).Combinando uma lista de quadros de dados em um único quadro de dados
Uma tarefa comum é combinar uma lista de quadros de dados em um grande quadro de dados. Se você deseja empilhá-las umas sobre as outras, você usaria
rbind
para um par delas, mas para uma lista de quadros de dados, aqui estão três boas opções:(Da mesma forma, usando
cbind
oudplyr::bind_cols
para colunas.)Para mesclar (ingressar) em uma lista de quadros de dados, você pode ver essas respostas . Muitas vezes, a ideia é usar
Reduce
commerge
(ou alguma outra função de junção) para reuni-los.Por que colocar os dados em uma lista?
Coloque dados semelhantes em listas porque você quer fazer coisas semelhantes a cada frame de dados, e funções como
lapply
,sapply
do.call
, opurrr
pacote , e as antigasplyr
l*ply
funções tornam mais fácil para fazer isso. Exemplos de pessoas que fazem coisas facilmente com listas estão por toda parte.Mesmo se você usar um loop for lowly, é muito mais fácil fazer um loop sobre os elementos de uma lista do que construir nomes de variáveis
paste
e acessar os objetos comget
. Mais fácil de depurar também.Pense em escalabilidade . Se você realmente só precisa de três variáveis, é bom para usar
d1
,d2
,d3
. Mas se você realmente precisa de 6, é muito mais digitação. E da próxima vez, quando você precisa de 10 ou 20, você encontrar-se copiando e colando linhas de código, talvez usando find / substituir a mudançad14
parad15
, e você está pensando não é assim que a programação deve ser . Se você usar uma lista, a diferença entre 3 casos, 30 casos e 300 casos será no máximo uma linha de código - nenhuma alteração será alterada se o número de casos for detectado automaticamente por, por exemplo, quantos.csv
arquivos existem no seu diretório.Você pode nomear os elementos de uma lista, caso deseje usar algo diferente de índices numéricos para acessar seus quadros de dados (e você pode usar os dois, essa não é uma opção XOR).
No geral, o uso de listas o levará a escrever códigos mais limpos e fáceis de ler, o que resultará em menos bugs e menos confusão.
fonte
r
elist
.my_data <- NULL
vez de `my_data <- list () '! :)my_data <- list()
deixa claro que você está criando uma lista, o que é bom! Código claro é uma coisa boa. Não vejo nenhuma vantagem em usarmy_data <- NULL
.names(my_data) <- gsub("\\.csv$", "", my_files)
;) <br> Mas eu respeito seus conselhos, já que estou aprendendo muito com eles como novato e eu realmente aprecio isso :) #Você também pode acessar colunas e valores específicos em cada elemento da lista com
[
e[[
. Aqui estão alguns exemplos. Primeiro, podemos acessar apenas a primeira coluna de cada quadro de dados na lista comlapply(ldf, "[", 1)
, onde1
significa o número da coluna.Da mesma forma, podemos acessar o primeiro valor na segunda coluna com
Em seguida, também podemos acessar os valores da coluna diretamente, como um vetor, com
[[
fonte
Se você tiver um grande número de quadros de dados nomeados sequencialmente, poderá criar uma lista do subconjunto desejado de quadros de dados como este:
onde
my.list2
retorna uma lista contendo os segundo, terceiro e quarto quadros de dados.Observe, no entanto, que os quadros de dados na lista acima não são mais nomeados. Se você deseja criar uma lista contendo um subconjunto de quadros de dados e deseja preservar seus nomes, tente o seguinte:
que retorna:
fonte
lapply(foo, get)
, basta usarmget(foo)
Considerando que você tem um número "grande" de data.frames com nomes semelhantes (aqui d # onde # é algum número inteiro positivo), a seguir está uma pequena melhoria do método @ mark-miller's. É mais conciso e retorna uma lista nomeada de data.frames, em que cada nome na lista é o nome do data.frame original correspondente.
A chave está usando
mget
junto comls
. Se os quadros de dados d1 e d2 fornecidos na pergunta foram os únicos objetos com nomes d # no ambiente, entãoque retornaria
Esse método aproveita o argumento padrão
ls
, que nos permite usar expressões regulares para fazer uma análise mais precisa dos nomes dos objetos no ambiente. Uma alternativa para o regex"^d[0-9]+$"
é"^d\\d+$"
.Como @gregor aponta , é melhor configurar o processo de construção de dados para que os data.frames sejam colocados em listas nomeadas no início.
dados
fonte
Pode ser um pouco tarde, mas voltando ao seu exemplo, pensei em estender a resposta um pouco.
Então você faz sua lista facilmente:
Agora você tem uma lista, mas em vez de acessar a lista da maneira antiga, como
você pode usar esta função para obter e atribuir o quadro de dados de sua escolha.
Agora pegue o que você deseja.
Espero que um pouco mais ajude.
Felicidades!
fonte
GETDF_FROMLIST(mylist, 1)
paramylist[[1]]
? Se você preferir a sintaxe da função, poderá fazê-lo"[["(mylist, 1)
sem definir uma função personalizada.return(DF_LIST[[ITEM_LOC]])
, sem necessidade de atribuir uma variável intermediária.Muito simples ! Aqui está a minha sugestão:
Se você deseja selecionar quadros de dados no seu espaço de trabalho, tente o seguinte:
ou
tudo isso dará o mesmo resultado.
Você pode alterar
is.data.frame
para verificar outros tipos de variáveis comois.function
fonte
Eu me considero um novato completo, mas acho que tenho uma resposta extremamente simples para uma das subquestões originais que não foram declaradas aqui: acessar os quadros de dados ou partes dele.
Vamos começar criando a lista com quadros de dados, como foi afirmado acima:
Então, se você quiser acessar um valor específico em um dos quadros de dados, poderá fazê-lo usando os colchetes duplos sequencialmente. O primeiro conjunto leva você ao quadro de dados e o segundo conjunto leva você às coordenadas específicas:
fonte