Buscar

B06Y4R5MHP_EBOK

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 3, do total de 643 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 6, do total de 643 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes
Você viu 9, do total de 643 páginas

Faça como milhares de estudantes: teste grátis o Passei Direto

Esse e outros conteúdos desbloqueados

16 milhões de materiais de várias disciplinas

Impressão de materiais

Agora você pode testar o

Passei Direto grátis

Você também pode ser Premium ajudando estudantes

Prévia do material em texto

R
250 Perguntas e Respostas de Especialistas 2ª Ed
R.B. Evaluations
Revisado e Atualizado em Janeiro, 2020
Sumário
Introdução
Conceitos Básicos
Big Data
Estratégias para analisar bases de dados muito grandes em R (que não caibam na memória RAM)
Como ler os microdados do ENEM no R?
Há como abrir uma tabela SQL direto num data.table, sem fazer o caminho SQL > data.frame > data.table?
No R, quando um vetor se torna "too long"?
Criar nova matriz a partir de uma primeira bastante grande de forma eficiente
Em R, uma função que leia apenas algumas colunas de um dataframe em formato Rda
Data frame
Como consolidar (agregar ou agrupar) os valores em uma base de dados?
Erro ao converter números. Como converter fatores para números?
Procurar valores em um data.frame e adicionar em outro (R)
Deletar linhas que contém NA em um data frame
Como formatar uma tabela (data.frame) com qualidade de publicação em pdf (latex) no R?
Como fazer um gráfico condicional y~x para cada fator do data.frame?
O que são dados no formato wide/long?
Criar coluna com soma e percentual do máximo de outras colunas
Como remover uma coluna do data.frame em R?
Como calcular a mediana de uma linha em um data.frame no R?
Como ordenar um data.frame por colunas no R?
Como filtrar um data frame?
Como ler uma tabela faltando elementos ou mal configurada?
Como selecionar todas as variáveis do data.frame de uma vez para uma regressão?
Como criar um for no R com os índices de um data frame
Qual função no R para reordenar um data.frame que contém dados ausentes (NA)?
Completar observações em um data frame
O que são colunas-lista de uma data.frame?
Como transformar a classe de uma coluna "factor" em "date" dentro de um data.frame?
Renomear os níveis de um fator baseado em um data frame
Como unir dois data.frames de tamanhos diferentes por colunas no R?
Data Frame e Regressão Linear
Eliminando linhas duplas de um Data.Frame
Aplicar uma função usando algumas colunas de todas as linhas de um Dataframe (r)
Preenchendo data.frame a partir de outro data.frame
Realizar um filtro e salvar em csv
Média de linhas repetidas
Error in plot.window(...) : need finite 'ylim' values
Datas
Calcular diferença entre datas em Horas no R
Como transformar uma string no formato Date no R?
Detectar qual o último dia do mês
Cálculo de Diferença entre Datas
Conversão de character em Date - 4 dígitos
Como converter string (em português) em data?
Como extrair o número da semana do mês no R?
Como ler arquivo txt com datasets composto por múltiplas dimensões?
Dplyr
Adicionar rownames como coluna usando dplyr
Como separar uma string de uma certa linha de um data.frame e ao mesmo tempo criar mais linhas?
Gráfico de barras ordenado utilizando dplyr e ggplot2
Contagem acumulada de ocorrências de grupos em datas
Melhoria de código
R - Selecionar elementos de um data frame com uma coluna que tem o mesmo nome de uma variável global com `dplyr`
Incluindo colunas em um dataframe no R utilizando uma regra
Reorganizar data frame em uma lista usando dplyr no R
Como calcular variação percentual com 3 variáveis no R
Como usar o dplyr dentro de uma função?
Selecionar múltiplas linhas de um data.frame, a partir dos maiores valores R
Ggplot2
Como suavizar uma curva no R
Como posicionar corretamente os labels na barplot?
Modificar cores em gráficos no ggplot2
Editar gráfico de barras no R: Ordem dos valores do eixo X - Legenda - Cor das barras - Inserir retas - Inserir comentários
Como preencher gráficos de coluna com hachuras usando ggplot2
Tamanho dos painéis com facet_wrap
Posição de Texto em gráfico de pizza no ggplot2
Histograma 3D usando ggplot2
Problema ao usar ggplot by group
Como colocar gráficos diferentes do ggplot2, separados, mas na mesma tela?
gráfico de barras ggplot 2 vetores lado a lado
Como colocar legenda em graficos de distribuições no ggplot
Como suavizar uma curva e definir ylim para uma dada função usando ggplot2?
Ordenamento de Datas ggplot2
Ggplot de um Data.frame em gráficos separados
sobrepor histrogramas
Como encaixar uma curva de Lowess em dados longitudinais usando R?
Sobrepor gráficos no R com o ggplot
Como inserir legenda em gráfico com dois eixos y no r?
Gráficos em geral
Como fazer um gráfico de bolhas, cada uma delas preenchida de acordo com uma proporção
Área da interseção de dois polígonos
Gráfico de dispersão com Histogramas marginais
Como criar gráfico de Agulhas no R?
Gráfico de perfis de média (incluindo as barras de erro)
Como faço para colocar o eixo Y invertido (decrescente) no R?
Alterar cores no gráfico
Criando um gráfico de barras dentro de outro gráfico de barras
Qual a forma de armazenar um gráfico como uma variável e exporta-la depois?
Como alterar a escala do eixo y em um gráfico de linha
Como fazer círculos concêntricos no plot do r
Organizar as barras de um gráfico de barras no R
Plot Main Title com Texto e formula y = a + betaX + Epsilon
como colocar os valores do histograma no topo da barra
Palavras sobrepostas no gráfico do software R
Como verificar se um polígono é regular ou convexo
Importação e Exportação
Organizar dados no Excel para abrir como tabela no R?
Como importar dados do excel pro R?
Exportar dados do Google Sheets para o R
Como fazer um "rbind" em tabelas de uma base SQL a partir do R?
Filtrar arquivo CSV de 5GB no R
Como faço para exportar tabela no R em txt ou csv?
R não está reconhecendo os separadores do arquivo csv
Importar várias tabelas do excel ao mesmo tempo
leitura de arquivo .XLSX no R
Importar dados do banco central para o R
Como importar várias abas do excel ao mesmo tempo?
Unir arquivos csv em um só
Machine Learning
Reconhecimento de padrões
Conectando os pontos à linha de regressão
Como colocar a equação da regressão em um gráfico?
Como colocar a linha de regressão em um gráfico?
Como identificar corretamente os clusters utilizando kmeans?
Como plotar o modelo estimado da regressão logística
Problema com forecast no R
Regressão logística com variável não binária
Matrizes
vetorizar média móvel de uma matriz no R
Somatoria acumulando colunas em uma matrix no R
Eficiência computacional no R - listas ou vetores
Como otimizar a remoção de linhas em uma matriz?
Comparação de duas matrizes com tamanhos diferentes
Como dividir os elementos de uma matriz pela média da sua coluna
Fazer uma matriz de origens e destinos
R em geral
Qual é a utilidade dos escopos léxico e dinâmico no R?
Quais as principais funções para se criar um exemplo mínimo reproduzível em R?
Equivalente a SOMASES do Excel, no R
Estimar a distribuição de Poisson - R
Como encontrar numa tabela a categoria com o mínimo de observações?
Como extrair valores da estatística calculada pela função linhom (L-function for inhomogeneous spatial point processes)?
O que significa <<- em R?
Como remover linha que tem missing?
Qual a diferença entre [] e [[]] no R?
Estimar variável de difícil isolamento
Como saber os argumentos contidos no '...' numa função em R?
Menor Data em um conjunto de dados
Construtor e herança no R
Gerar sequencia no R
Alterar nome de uma variavel em um dataframe R
Em R, usando o pacote plotly, posso plotar o mapa do Brasil e seus estados?
Como posicionar texto nas colunas intermediárias?
Quais são as diferenças entre require() e library()?
Como alterar o nome de uma coluna
Download arquivos zip de um link para uma pasta do PC através do R
Como atribuir NA como valor?
Contar valores iguais em um data frame e armazenar em outro no R
Pegar o valor anterior com uma condição no R
Apagando colunas que contenham NA´s em suas ultimas 5 linhas
Gerar e baixar links programaticamente
Adicionar notação de moeda em R
Construindo uma função definindo x e y usando R
R - cortar dígitos
Como construir um executável/instalador de uma rotina escrita em R?
Juntar valores espalhados em diferentes linhas em uma mesma linha
Como transformar um numero com virgula no R?
Como fazer o teste de Dunnett no R?
Acessar informações de um data.frame em R
Funções com quantidade de argumentos "dinâmica"
Como checar se uma determinada sequencia de elementsexiste no R?
Juntar vários arquivos de uma pasta no R
Como mudar o ponto de corte (cut-off) na função glm?
Programar atualizações automáticas no R
Como somar os valores de colunas selecionadas de cada observação (linha) no R?
Execução de múltiplas funções dentro de loops *pply
Como salvar os valores de todas as iterações no R
Sintaxe do R
Como criar objetos (variáveis) com diferentes nomes dentro de um loop?
Existe algum estrutura de hash em R?
Por que 0.1 + 0.05 não é igual a 0.15? Que soluções podem ser utilizadas no R?
Como excluir elemento de uma lista em R
Variância negativa no R? Propagação de erro em ponto flutuante
Procurar uma expressão em diversos elementos de uma lista
Remover todos os elementos do Environment que contenham números e letras maiúsculas
Existe diferença entre atribuir valor usando '<-' ou '=' em R?
Como declarar constantes no R
Erro com funções de nomeação de variáveis em uma lista
De que maneira posso reestruturar informações contidas um objeto do tipo list, em duas colunas?
Como usar o operador %<>% em R
No R, qual a melhor maneira de selecionar conjuntos das listas internas dentro de uma lista de listas?
Aplicação da função `assign` em loops
Como dividir os dataframes de uma lista com base em uma variável de grupo, comum em todos eles?
data.frame com hierarquia para lista aninhada no R
Por que loops são lentos no R? Como evitá-los?
Continuar a execução do loop mesmo que uma passagem dê problema
Extrair dataframes de listas com dataframes sob determinado criterio no R
Remover elementos do Environment (e da lista) com base em suas classes
Mudar <chr> para número no R
Como paralelizar em vários níveis no R?
Como extrair todo enésimo elemento de uma lista?
Como definir o número de clusters no algoritmo Kmeans no R?
Como usar letras ao invés de números dentro do vetor LETTERS?
Como fazer um loop/rotina para a função write.fst()?
Converter números escritos com separador de milhar para valor numérico no R
Como converter números em categorias no R
Estrutura de repetição em R
Strings
O que é a "quebra de linha" em uma RegEx?
Diferença entre os quantificadores não gananciosos ?? e *?
Remover acentos
Como reconhecer e alterar o encoding de caracteres latinos no R?
Em R, contar palavras e introduzir um quebra de linha
Saber a frequência de palavras
Como remover uma palavra de uma string sem alterar palavras maiores que a contém
Remover nomes duplicados com expressão regular
Diferença entre os metacaracteres .* e +
Como separar os caracteres de uma string em R?
Expressão Regular R
Dúvida de como mensurar o número de palavras entre duas palavras especificas em uma string no R
Como concatenar duas strings?
Classificar um vetor de textos usando expressões regulares usando R
Metacaractere retrovisor \x não pega os grupos correspondentes quando mudo a ordem destes
Como funciona o metacaractere \t em uma regex?
Dividir Coluna em Outras duas Lat Long
Como selecionar strings que comecem com uma determinada palavra
Funções R - Caractere Estranho
Web
Web scraping com R
Como fazer o webscrapping de um site que tem método post?
Web scraping para coleta de artigos científicos na ScienceDirect
Pegar tabela de URL no R
Erro ao tentar extrair tabela de um site pelo R, como resolver?
Outras
R é uma linguagem orientada a objetos?
Apply, sapply, mapply, lapply, vapply,rapply, tapply, replicate, aggregate, by e correlatos no R. Quando e como utilizar?
O que é e para que serve uma função anônima em R?
Como converter um app Shiny, consistindo em múltiplos arquivos, em um exemplo reprodutível que possa ser
compartilhado em uma pergunta?
Chamar funções em C a partir do R
Orientação a objetos no R: S3, S4 e Reference Class
A função order em R
O que é uma aplicação Shiny?
Diferença entre function factory e closure
Como calcular a mediana quando os dados estão em chunks?
Contar sequências de 1 dentro de vetor em R
RStudio: não carregar automaticamente variáveis no environment
R - Mapa de cidades brasileiras
Como aplicar várias funções ao mesmo objeto?
PDF para texto organizando as colunas
Como usar conteúdos de um vetor para montar o nome de um arquivo a ser salvo?
Como solucionar o limite 53 categorias do randomForest do R?
Qual é a utilidade das funções com underline (_) ao final?
Recursão no R erro
Preencher coluna de um data frame com dados de outro data frame no R
Como criar um Stopwords, utilizando R
Gerar links e baixar conteúdo programaticamente
Como ler dados de PDF no R?
Como fazer soma móvel no R?
Repetindo a subtração de grupos em um data frame para todas as variáveis numéricas
Como guardar a senha no script R no package ‘encryptr’?
Argumentos barplot
Como alterar o idioma do R?
Como gerar valores aleatórios para uma distribuição conhecida?
Transformar local em CEP
Dividir base com o "for" no R
Como fazer e calcular a Tabela de distribuição de frequência em R?
Por que a última previsão da série temporal com o pacote neuralnet é muito discrepante ao resto das previsões?
Como implementar mappers no R?
Tempo de processamento de funções
Identificar casos com várias condições em várias colunas no R
Leitura de pdf via R
Calculo Probabilidades T-Student no R
Como referenciar colunas numa função do R?
criação de gif no r
Como construir séries temporais com frequências diferentes da original?
Notas
Copyright e Sobre o Autor
Copyright© 2020 R. B. Evaluations
All rights reserved.
Todos direitos reservados.
Publicação Independente
1ª edição em português: 2020
CONCEPÇÃO:
R. B. Evaluations
DIAGRAMAÇÃO E REVISÃO:
R. Juliano
TEXTO:
Comunidade Stack Overflow Português
Introdução
R: 250 Perguntas e Respostas de Especialistas 2ª Ed
ESTE É UM LIVRO SOBRE R. R é uma linguagem de programação integrada a um ambiente de
desenvolvimento para cálculos estatísticos e geração de gráficos. É utilizada por analistas de
dados, estatísticos e em pesquisa de mineração de dados. R é capaz de ser estendida por pacotes
desenvolvidos para geração de gráficos, relatórios, importação e exportação de dados.
O livro é uma compilação de mais de 250 perguntas e respostas sobre R e conceitos
relacionados, como data frames, vetores, gráficos, o pacote ggplot2 e o R Studio. Estas questões
são originárias da maior comunidade web de conteúdo aberto sobre programação, o Stack
Overflow. O livro foi produzido com auxílio de algoritmos de Machine Learning. Foram
utilizadas técnicas de Inteligência Artificial para agrupar questões similares (clusterização) e
identificar questões relevantes (classificação). Em seguida foi feito um pós-processamento para
tratamento dessas informações. O resultado é um livro organizado com 250 questões essenciais e
com respostas de qualidade para auxiliar o desenvolvedor R em seu dia-a-dia.
Leia sobre como consolidar (agregar ou agrupar) os valores em uma base de dados. Descubra
o que é a "quebra de linha" em uma RegEx. Saiba como ler os microdados do ENEM no R. Veja
qual é a utilidade dos escopos léxico e dinâmico no R. Explore o que é e para que serve uma
função anônima em R. E muito mais!
Stack Overflow
O Stack Overflow é o principal site da rede Stack Exchange, criado em 2008 como um site
aberto de perguntas e respostas. Ele serve como plataforma para que os usuários façam perguntas
e também as respondam. Mas além disso podem, através do registro e da participação ativa, votar
em questões e respostas mais úteis.
O Stack Overflow tem mais de 4 milhões de usuários e mais de 11 milhões de perguntas. Os
oito tópicos mais discutidos no site são: Java, JavaScript, C#, PHP, Android, jQuery, Python e
HTML.
Todo o conteúdo gerado pelos usuários é licenciado sob a licença Creative Commons.
Todas as perguntas e respostas contidas no livro são devidamente citadas e com referências
ao seu conteúdo original. O autor entende que este livro é um complemento ao site Stack
Overflow, e convida a todos os leitores a contribuírem e utilizarem a comunidade ativamente,
assim como o próprio. Desta forma a comunidade ganha força e qualidade, trazendo materiais
cada vez mais interessantes para o público.Licença:
creativecommons.org/licenses/by-sa/3.0
http://creativecommons.org/licenses/by-sa/3.0/
Conceitos Básicos
R
R
O R é um ambiente e linguagem de programação de código aberto para computação estatística,
bioinformática e gráficos. O R é uma implementação da linguagem de programação S combinada
com o escopo de léxico semântico inspirado em Scheme. O R foi criado por Ross Ihaka e Robert
Gentleman e agora é desenvolvido pelo R Development Core Team. O ambiente R é facilmente
estendido por meio de pacotes no CRAN.
Documentação oficial do CRAN (em inglês):
PDF HTML An Introduction to R, uma introdução básica para iniciantes.
PDF HTML The R Language Definition, uma discussão mais técnica sobre a linguagem R.
PDF HTML Writing R Extensions, um guia para desenvolvedores em R.
PDF HTML R Data Import/Export, um guia para importar e exportar dados.
PDF HTML R Installation, um guia de instalação por meio do código fonte do R.
PDF HTML R Internals, guia para as estruturas internas e códigos.
Outros recursos do CRAN:
Pacotes na biblioteca padrão
Listas de email do R
Task Views - compilação de pacotes úteis divididos por área de uso.
Livros e outros documentos sobre o R em várias línguas que não inglês.
The R Journal artigos acadêmicos utilizando o R.
R FAQ - Lista oficial de FAQ do R e CRAN
Materiais gratuitos
Aprendizado interativo do R
Try R - Um tutorial web interativo
DataCamp - Aprenda análise de dados no R interativamente
Swirl - Aprenda R no R
Textos e apostilas gratuitos sobre o R:
PDF The R Inferno por Patrick Burns
R by example
R Programming wikibook
Introdução ao Ambiente Estatístico R
Livro: "Advanced R"
Livro: "R packages"
Livro: "R for Data Science"
IDEs e editores para o R
ESS (Emacs Speaks Statistics) - pacote para Emacs
RStudio - IDE para R
StatET - plugin para a IDE Eclipse
Revolution-R - IDE comercial
Live-R - IDE em browser
JGR - GUI para R baseada em Java
Tinn-R - Editor de código para R
Sciviews-K - Extensão para a IDE Komodo
NppToR - plugin para Notepad++
Vim-R - plugin para Vim
Outros materiais
Recursos adicionais sobre R recomendados incluem:
RSeek - pesquisa focada em R
Cookbook for R - Soluções para problemas comuns
Quick-R
R programming language do wikipedia
R-bloggers - Agregador de blogs sobre o R
Doku Wiki R - Doku Wiki R
Grupo R Brasil no Telegram
Wiki[1]por Maniero[2]
Big-data
Big Data pode ser vista como conjuntos de dados extremamente amplos e que, por este motivo,
necessitam de ferramentas especialmente preparadas para lidar com grandes volumes, de forma
que toda e qualquer informação nestes meios possa ser encontrada, analisada e aproveitada em
tempo hábil, este conceito também pode ser compreendido como a análise de grandes
quantidades de dados para a geração de resultados importantes que, em volumes menores,
dificilmente seriam alcançados.
Wiki[3]por Ricardo[4]
Data.frame
Um data.frame é uma das estruturas de dados de base na linguagem R. Os data.frame são listas
de variáveis​​, cada uma com o mesmo número de linhas, semelhante a uma tabela numa base de
dados. Ao contrário de matrizes em R, cada variável pode ser de um tipo de dados diferente 
Wiki[5]por Carlos Cinelli[6]
Ggplot2
ggplot2 é um pacote de desenho gráfico para o R, desenvolvido por Hadley Wickham, com base
nos princípios da Gramática dos Gráficos de Leland Wilkinson. Ele substitui parcialmente os
pacotes graphics e lattice, oferencendo uma API limpa e poderosa.
Repositórios (em Inglês)
Versão de desenvolvimento no github (issues, wiki)
Versão estável no CRAN
Vignettes (em Inglês)
Contributing to ggplot2 development
ggplot2 release process
Livros (em Inglês)
ggplot2: Elegant Graphics for Data Analysis by Hadley Wickham
R Graphics Cookbook by Winston Chang
R Graphics by Paul Murrell
Outros recursos (em Inglês)
Página do pacote
Documentação
Google group
Gráficos do Cookbook for R by Winston Chang
Uso e comparação com o lattice no blog Learning R
Posts no R-bloggers
Wiki[7]por Carlos Cinelli[8]
Rstudio
RStudio é um ambiente de desenvolvimento integrado livre e de código aberto (IDE) para R 
Wiki[9]por Carlos Cinelli[10]
Big Data
Estratégias para analisar bases de dados muito grandes em R
(que não caibam na memória RAM)
Suponha que eu tenha uma base de dados enorme que não caiba na memória RAM. Quais
estratégias para analisar esta base de dados no R, uma vez que não posso carregá-la inteiramente
na memória?
PS: a pergunta não trata somente de como fazer o R conversar com uma base de dados
relacional/não-relacional. Se, por exemplo, os seus dados estiverem em uma base de dados
relacional, você ainda assim não pode carregá-los todos de uma vez no R para rodar um random
forest ou uma regressão, por exemplo.
Pergunta[11]de Carlos Cinelli[12]
Resposta 1
R é uma linguagem especializada cujo sweet spot são problemas de análise de dados em
memória (um conjunto extremamente significativo de problemas).
Dito isso o ecossistema do R é grande e diversas soluções estão surgindo para tratar problemas
com volumes enormes de dados. Tenha em mente que problemas de Big Data utilizam sim
técnicas específicas (e muitas vezes, soluções de Software / Hardware / Sistema de Arquivos e
protocolos específicos) como MapReduce. Não assuma que você pode fazer tudo o que faz em
uma data.frame com volumes de dados gigantescos, e, mesmo que determinada técnica possa
ser aplicada, não assuma que os algoritmos são parecidos.
Tenha em mente que assuntos como regressão com MapReduce ainda são problemas de pesquisa
em aberto, novos algoritmos e novas implementações estão surgindo dentro e fora do
ecossistema R (você pode encontrar mais informações em papers como Robust Regression on
MapReduce).
Para te dar um gosto sobre por onde começar, já existem pacotes que implementam:
Estruturas de dados massivas / mapeamento em disco / blocagem como bigmemory e ff.
Algoritmos para analisar data sets demasiadamente grandes para caber em memória (veja
por exemplo o biglm para problemas de regressão linear).
Soluções baseadas em Hadoop para orquestrar jobs MapReduce com R (veja MapReduce
with R on Hadoop and Amazon EMR e Revolution Analytics)
Ecossistemas para HPC como o pbdR e Oracle R Enterprise.
Resposta de Anthony Accioly[13] 
http://en.wikipedia.org/wiki/MapReduce
http://www.cs.yale.edu/homes/mmahoney/pubs/rrinmr-icml13.pdf
http://cran.r-project.org/web/packages/bigmemory/index.html
http://cran.r-project.org/web/packages/ff/index.html
http://cran.r-project.org/web/packages/biglm/index.html
http://www.joyofdata.de/blog/mapreduce-r-hadoop-amazon-emr/
http://www.revolutionanalytics.com/
http://r-pbd.org/
http://www.oracle.com/technetwork/database/database-technologies/r/r-enterprise/overview/index.html
Resposta 2
Essa pergunta depende de alguns fatores como a tarefa de análise que se deseja realizar e o
tamanho do conjunto de dados, isto é, o quanto ele é grande em relação à memória RAM (e as
vezes o HD) do computador onde se pretende realizar a análise. Existem alguns casos a se
considerar:
Quanto ao tamanho do conjunto de dados:
Conjuntos de dados maiores que a RAM mas menores que HD's comuns em computadores
pessoais, algo como 20Gb por exemplo.
Conjuntos de dados maiores que a RAM e o HD de computadores pessoais.
Quanto ao tipo de análise:
Análises descritivas, consultas e cálculos simples.
Análises mais complexas, incluindo ajuste de modelos como RandomForest, Regressões
Lineares e etc.
Quando o conjunto de dados é de tamanho moderado, maior que a RAM, mas não tão grande a
ponto de que seja impossível tratá-lo em um único PC, pacotes do R como ff, Bigmemory ou
mesmo o pacote ScaleR da Revolution Analytics são capazes de realizar análises simples e mais
complexas. Uma ressalva nestes casos são as situações onde, mesmo com esses pacotes, o
procedimento é muito lento em relação à necessidade do usuário. Outra solução menos
conhecida é utilizar a biblioteca MADLib, que estende o Postgres e permite realizar análises
complexas em grandes conjuntos de dados, como Regressões Lineares/Logísticas,RandomForest
e etc, diretamente a partir do R por meio do pacote PivotalR.
Se a análise envolve somente consultas simples e estatísticas descritivas, uma solução
interessante pode ser simplesmente carregar o conjunto de dados em um Sistema de
Gerenciamento de Banco de Dados (SGBD) como o Postgres, o MySQL, o SQLite3 e o
MonetDB, e transformar os cálculos em consultas em SQL. Outra alternativa é utilizar o pacote
dplyr, com o qual o usuário define a origem dos dados como um destes SGBD's e o pacote
converte automaticamente operações do dplyr em código SQL. Além destas alternativas, o dplyr
permite a utilização de serviços de Big Data na nuvem, como o BigQuery, onde o usuário pode
realizar operações de consulta diretamente a partir do terminal com o dplyr, da mesma forma que
faria caso estivesse utilizando um data.frame.
Em situações onde o conjunto de dados é muito maior que a memória RAM, por vezes intratável
em um único computador, há a necessidade de se utilizar frameworks que permitem
processamento distribuído de grandes conjuntos de dados como o Apache Hadoop ou o Apache
Spark. Nestes casos, dependendo do tipo de análise que se deseja realizar, como consultas e
cálculos simples, o Hadoop + R com o pacote RHadoop ou o Spark + R com o pacote SparkR
podem ser suficientes.
Tanto o Hadoop quanto o Spark, contam com projetos associados que implementam métodos de
Machine Learning como Apache Mahout e a MLib, que não estão disponíveis para o uso junto
ao R. Entretanto existe o engine H2O da 0xadata que possui uma API para o R tal que o usuário
http://ff.r-forge.r-project.org/
http://cran.r-project.org/web/packages/bigmemory/index.html
http://www.revolutionanalytics.com/whitepaper/revolution-r-enterprise-scaler-fast-highly-scalable-r-multiple-processors
http://madlib.net/
http://cran.r-project.org/web/packages/PivotalR/index.html
http://www.postgresql.org/
http://www.mysql.com/
http://www.sqlite.org/
https://www.monetdb.org/Downloads
https://github.com/hadley/dplyr
https://cloud.google.com/bigquery/
http://hadoop.apache.org/
https://spark.apache.org/
https://github.com/RevolutionAnalytics/RHadoop/wiki
http://amplab-extras.github.io/SparkR-pkg/
https://mahout.apache.org/
https://spark.apache.org/docs/latest/mllib-guide.html
http://0xdata.com/
http://0xdata.com/blog/2013/08/run-h2o-from-within-r/
pode implementar métodos de modelagem em grandes conjuntos de dados. A MADlib, citada
anteriormente, também pode ser utilizada em sistemas de gerenciamento de banco de dados
distribuídos como o Greenplum, tal que junto ao pacote PivotalR, permite realizar análises
complexas. O pacote ScaleR da Revolution também pode ser utilizado nestes casos, onde ele
utiliza uma infraestrutura de Big Data como backend.
Resposta de Flavio Barros[14] 
Voltar para o Sumário
* * *
http://www.pivotal.io/big-data/pivotal-greenplum-database
Como ler os microdados do ENEM no R?
O INEP (Instituto Nacional de Estudos e Pesquisas Educacionais Anísio Teixeira) disponibiliza
para download os microdados do ENEM (e outros) a partir deste link. Estes microdados são os
dados crús do ENEM, com informações na granularidade de alunos.
Ao fazer o download dos microdados do ENEM 2014, por exemplo, você baixa um arquivo com
extensão zip de aproximadamente 1,2Gb. Ao extrair o conteúdo deste arquivo há na estrutura de
pastas toda a documentação deste conjunto de dados e também os microdados. Na pasta DADOS
há o arquivo MICRODADOS_ENEM_2014.csv. Esse arquivo tem 6Gb de tamanho tal que
comandos como:
dados <- read.csv('MICRODADOS_ENEM_2014.csv', header=T)
não funcionam na maioria dos PC's comuns em virtude da limitação da memória RAM.
Qual é a melhor alternativa para ler este conjunto de dados no R em um PC comum? Gostaria
especialmente de métodos concretos para efetuar esta leitura com a ajuda de pacotes do R e
TAMBÉM utilizando sistemas de gerenciamento de banco de dados.
OBS: Estou ciente com relação a pergunta Estratégias para analisar bases de dados muito
grandes em R (que não caibam na memória RAM), tendo inclusive participado como um dos
respondentes. ENTRETANTO, a pergunta teve um caráter mais genérico, não produzindo nas
respostas nenhum código em R que pudesse resolver o problema específico desta questão.
Pergunta[15]de Flavio Barros[16]
Resposta 1
As funções do tipo read.csv que o R possui carregam na memória RAM o conteúdo dos
arquivos que estão sendo lidos. Assim, há três maneiras principais de se trabalhar com dados
grandes que não cabem na memória do R:
1. Aumente a sua memória RAM
2. Tome uma amostra dos seus dados
3. Leia os dados a partir do disco, sem carregá-los na RAM
A solução 1 seria a ideal. Afinal, não seria preciso aprender nada novo, pois poderíamos
trabalhar com os dados carregados diretamente na RAM, como se fosse um arquivo de tamanho
normal. Entretanto, isto custa dinheiro.
A solução 2 não é ruim. Desde que se tome uma amostra representativa dos dados, não há porque
imaginar que a análise feita deste jeito seja ruim. Mas nós estatísticos já trabalhamos com
amostragem por tanto tempo. Por que não aproveitamos esta infinidade de dados que temos hoje
em dia e não analisamos todos eles? Afinal, melhor do que cometer pequenos erros ao analisar
uma amostra é não cometer erro nenhum, analisando a população inteira.
http://portal.inep.gov.br/basica-levantamentos-acessar
http://download.inep.gov.br/microdados/microdados_enem2014.zip
https://pt.stackoverflow.com/questions/30631/estrat%C3%A9gias-para-analisar-bases-de-dados-muito-grandes-em-r-que-n%C3%A3o-caibam-na-m
A solução 3 é a que mais me agrada. Ela implica em não carregar completamente os dados na
memória RAM, e sim lê-los de maneira incremental a partir do disco. Felizmente, o R possui
diversos pacotes que facilitam a nossa vida para fazer isto. Eu vou utilizar um deles aqui,
chamado ff.
No exemplo abaixo eu carrego o pacote ff, leio os microdados do ENEM do ano de 2014 e crio
uma tabela com o número de candidatos inscritos por estado brasileiro:
library(ff)
enem <- read.csv.ffdf(file="MICRODADOS_ENEM_2014.csv", header=TRUE)
table(enem[, 22])
 AC AL AM AP BA CE DF 
 70096 65269 156393 172709 45553 720330 572238 143196 
 ES GO MA MG MS MT PA PB 
149299 218662 354018 987173 152758 155066 459417 233768 
 PE PI PR RJ RN RO RR RS 
441963 214878 409248 589757 196980 97263 19064 478792 
 SC SE SP TO 
143680 117885 1289458 67335
Note que utilizei o mesmo comando table que utilizamos normalmente para criar uma tabela de
contagens no R. A única diferença está no comando read.csv.ffdf, que tem sintaxe idêntica do
read.csv neste caso. Aliás, mesmo em outros casos, a sintaxe do read.csv.ffdf é bastante
similar à sintaxe do read.csv.
Claro que esta solução tem problemas. O principal deles é a velocidade. Eu avaliei o tempo de
execução dos dois comandos acima no meu PC e obtive o seguinte:
system.time(enem <- read.csv.ffdf(file="MICRODADOS_ENEM_2014.csv",
 header=TRUE))
 user system elapsed 
3302.942 170.418 3596.523 
system.time(table(enem[, 22]))
user system elapsed 
0.550 0.185 0.945
Eu levei praticamente uma hora para ler os dados de um ano de ENEM. Só para título de
comparação, fiz esta leitura em um laptop Intel i5 2.8GHz com 8GB de RAM e 512GB de SSD.
A tabela, entretanto, foi feita bem rapidamente, levando menos de um segundo para ficar pronta.
Portanto, esta é uma maneira de ler grandes conjuntos de dados no R. Além do ff, o pacote
bigmemory também é capaz disso. Imagino que hajam ainda mais pacotes, mas minha
experiência se limita a estes dois.
Saindo um pouco do R, o que eu sugiro para ti, a fim de diminuir o tempo gasto na análise, é
definir exatamente o que te interessa neste conjunto de dados. Ele tem 166 colunas. É muita
coluna. Além disso, ele também tem 8.722.249 linhas. É muita linha. Claro que todas elas são
importantes em nível nacional, mas talvez não sejam importantes para ti ou para a análise que tu
pretende fazer. Eu recomendo fortemente aprender alguns comandos do bash, como grep, cut e
awk, para fazeruma pré-filtragem destes dados.
Por exemplo, não há porque ler os resultados de todos os estados brasileiros na memória do R se
apenas o Rio Grande do Sul te interessa. Talvez importar a chave de respostas de todos os
alunos, com as colunas TX_RESPOSTAS_CN, TX_RESPOSTAS_CH, TX_RESPOSTAS_LC
eTX_RESPOSTAS_MT, não seja interessante para ti. Pode ser ainda que todas as 76 colunas do
questionário socioeconônico não importem para a tua análise. Não sei.
Mas, pela minha experiência, sugiro cortar tudo o que não te interessa antes de importar este
conjunto de dados no R para poder facilitar a tua análise, principalmente se teu interesse for
analisar os resultados de mais de um ano do ENEM. Imagine o tempo que vai ser gasto se tu
precisar combinar os resultados de quase 20 anos do exame. Só a leitura dos dados vai levar 20
horas, assumindo que o tempo de leitura aumente de maneira linear, o que é uma suposição que
não faz muito sentido.
Enfim, se eu estivesse fazendo uma análise deste tipo, eu excluiria as colunas e linhas que não
me interessam, pois assim eu otimizaria meu código, fazendo com que ele executasse mais
rapidamente, pois estaria tendo que gerenciar apenas os dados com os quais eu realmente me
importo.
Resposta de Marcus Nunes[17] 
Resposta 2
Uma solução elegante e que pode ser praticamente independente de recursos computacionais é
utilizar um software de pré-processamento linha a linha, filtrando apenas os registros desejados.
A ferramenta mais conhecida e popular para esse tipo de tarefa é a AWK - uma linguagem de
manipulação de textos -, cuja principal implementação é o gawk. O gawk possui implentações
para Linux, Windows e MacOS.
Não tenho exatamente os dados do ENEM, mas suponha que você queira processar os arquivos
do Censo Escolar 2015 (que, imagino, são bem semelhantes). A tabela TURMAS.CSV contém
dados de todas as turmas de educação básica regular no Brasil. Há um campo nesta tabela, cujo
cabeçalho indica o nome "CO_UF", que é o código da unidade da federação. Para filtrar somente
os registros do Espírito Santo, por exemplo, cujo código de unidade da federação é 32 (conforme
IBGE), eu chamaria o gawk da seguinte maneira:
gawk 'BEGIN {FS="|"} { if($73 == 32) print $0 }' TURMAS.CSV
Primeiramente (BEGIN) eu declaro o field separator (FS) como "|", que é o separador usado
nestes arquivos do INEP. Depois eu verifico se o campo 73 (esta parte é chata, eu preciso contar
os campos na descrição do CSV, ou na primeira linha que é o cabeçalho) é igual a 32 (código do
ES). No gawk cada campo, divido pelo separador, é ordenado e identificado após o cifrão ($).
Se o teste for positivo, eu imprimo a linha inteira (o código $0 é especial e imprime toda a linha
"recomposta", ou seja, os campos e os separadores). Para fazer uso desse filtro, eu redireciono o
pipe para um arquivo:
gawk 'BEGIN {FS="|"} { if($73 == 32) print $0 }' TURMAS.CSV > filtrado_es.csv
O arquivo filtrado_es.csv contém, então, somente os registros que satisfizeram a condição de
código de UF igual a 32, e portanto será menor, fazendo sofrer menos o R!
Se você tiver o gawk no seu PATH, pode chamar ele dentro do próprio R através do comando
pipe(). Por exemplo:
read.csv(pipe("gawk 'BEGIN {FS=\"|\"} {if ($73 == 32) print $0}'
/caminho/para/TURMAS.CSV"))
Neste caso, o read.csv irá ler o arquivo já pré-processado pelo gawk.
https://pt.wikipedia.org/wiki/AWK
https://www.gnu.org/software/gawk/
Resposta de Marcelo Reis[18] 
Voltar para o Sumário
* * *
Há como abrir uma tabela SQL direto num data.table, sem fazer
o caminho SQL > data.frame > data.table?
Desejo abrir uma tabela SQL direto num data.table. Quando faço uma query com dbGetQuery, o
que obtenho é um data.frame. Eu sei que depois posso transformar esse data.frame num
data.table facilmente. Mas eu gostaria de pular essa etapa -- que em determinadas ocasiões pode
não ser computacionalmente eficiente.
Abaixo um código mínimo reprodutível:
library(sqldf)
 library(data.table)
A <- data.frame(var1 = 1:10, var2=55:64)
 drv <- dbDriver("SQLite") 
 con <- dbConnect(drv, "basequalquer.db") 
 dbWriteTable(con, "TabelaA", A)
Na linha de comando abaixo, estou aplicando o comando data.table sobre o resultado do
dbGetQuery (que vem como data.frame). É exatamente isso que eu NÃO gostaria de fazer...
data.table(dbGetQuery(con, "Select * from TabelaA"))
 row_names var1 var2
 1: 1 1 55
2: 2 2 56
3: 3 3 57
4: 4 4 58
5: 5 5 59
6: 6 6 60
7: 7 7 61
8: 8 8 62
9: 9 9 63
10: 10 10 64
Sugestões?
Pergunta[19]de RogerioJB[20]
Resposta:
Dando uma fuçada no código descrobri que o segredo está na função fetch, que é uma
implementação feita no pacote RSQLite, para objetos do tipo SQLiteResult (classe S4), que
implementa o método genérico de mesmo nome definido no pacote DBI. No seu código, a função
dbGetQuery usa fetch. Assim, primeiro vou reproduzir seu código isolando a função fetch:
library(DBI)
library(RSQLite)
A <- data.frame(var1 = 1:10, var2=55:64)
drv <- dbDriver("SQLite") 
con <- dbConnect(drv, "basequalquer.db") 
dbWriteTable(con, "TabelaA", A) 
res <- dbSendQuery(con, "Select * from TabelaA")
fetch(res)
Olhando no código fonte do pacote RSQLite, podemos ver que fetch chama a função
sqliteFetch, copiada abaixo, que por sua vez chama um algoritmo em C, que faz todo o
trabalho sujo e retorna NULL ou uma list.
sqliteFetch <- function(res, n = 0) { 
 check_valid(res)
# Returns NULL, or a list
 rel <- .Call(rsqlite_query_fetch, res@Id, nrec = as.integer(n))
if (is.null(rel)) return(data.frame())
attr(rel, "row.names") <- .set_row_names(length(rel[[1]]))
 attr(rel, "class") <- "data.frame"
 rel
}
Note que o resultado rel torna-se um data.frame depois disso. Você poderia até tentar
transformar essa lista em data.table, mas isso não seria muito diferente de transformar um
data.frame em um data.table.
Assim, a menos que alguém já tenha implementado uma solução alternativa, para resolver seu
problema você teria de reimplementar a função em C para que retorne um objeto do tipo
data.table (que basicamente é um data.frame com um ponteiro como atributo). Além disso,
você precisaria mudar a definição genérica de fetch, que espera como resultado um data.frame
(veja aqui).
Eu particularmente não acho que valeria à pena, pois o ganho em eficiência não seria tão
significativo, mas o esforço seria.
A propósito, sugiro que considere a utilização do fantástico pacote dplyr, que possui funções
para extração eficiente de bases de dados, usando "avaliação preguiçosa" (basicamente, você
pode usar as funções mutate, filter, select, etc. do vocabulário do dplyr e o pacote
magicamente transforma essas operações em SQL antes de baixar os dados, o que pode resultar
em um enorme ganho em transferência de dados). Além disso, o pacote foi feito para ser
intuitivo e fácil de usar. Veja aqui.
Resposta de Julio Trecenti[21] 
Voltar para o Sumário
* * *
https://github.com/rstats-db/RSQLite/blob/f431ce83cd1e57372edf4c1c4ce970cc88471eb5/R/Result.R
https://github.com/rstats-db/DBI/blob/master/R/DBResult.R
http://cran.rstudio.com/web/packages/dplyr/vignettes/databases.html
No R, quando um vetor se torna "too long"?
Ao tentar criar um vetor infinito (1:Inf) recebi a seguinte mensagem:
Error in 1:Inf : result would be too long a vector
Contudo, quando o vetor não sabe na memória a mensagem costuma ser diferente. O código
abaixo criar as três situações: a) consegue criar o vetor, b) não cabe na memória e c) "too long".
object.size(1:1e9) # limite superior do tipo a
# 4000000040 bytes
object.size(1:1e10) # limite inferior do tipo b
# Error: cannot allocate vector of size 74.5 Gb
...
object.size(1:1e15) # limite superior do tipo b
# Error: cannot allocate vector of size 7450580.6 Gb
object.size(1:1e16) # limite inferior do tipo c
# Error in 1:1e+16 : result would be too long a vector
Pergunta: dado que os dois vetores (tipo b e tipo c) não caberiam na memória, como o R define
que ele caia em um caso ou no outro?
Pergunta[22]de Tomás Barcellos[23]
Resposta:Isso tem a ver com o código fonte do R. Veja que a função : está definida em C aqui. Lá, você
pode encontrar que esse erro aparece nessa condição:
double r = fabs(n2 - n1);
if(r >= R_XLEN_T_MAX)
 errorcall(call, _("result would be too long a vector"));
Essa constante R_XLEN_T_MAX por sua vez é definida aqui.
# define R_XLEN_T_MAX 4503599627370496
Ou seja, se o número for maior que 4503599627370496, acontecerá o erro. Agora veja que:
> 4503599627370496 > 1e15
[1] TRUE
> 4503599627370496 > 1e16
[1] FALSE
Veja também isso aqui:
> k <- 1:4503599627370496
https://github.com/wch/r-source/blob/trunk/src/main/seq.c#L97
https://github.com/wch/r-source/blob/bf0a0a9d12f2ce5d66673dc32cd253524f3270bf/src/include/Rinternals.h#L74
Error: cannot allocate vector of size 33554432.0 Gb
> k <- 1:4503599627370497
Error in 1:4503599627370497 : result would be too long a vector
Resposta de Daniel Falbel[24] 
Voltar para o Sumário
* * *
Criar nova matriz a partir de uma primeira bastante grande de
forma eficiente
Caros, em R, eu tenho uma base de dados muito grande e quero criar novas colunas. Vou tentar
explicar meu problema com uma matriz bem pequena. A seguir, "1" significa escola particular e
"2", publica. Tenho por exemplo uma base de dados
>Data
Casa Escola
1 1
1 1
1 2
1 2
2 1
2 2
2 1
3 1
3 1
3 1
3 1
Nese caso, concluímos que a casa 1 tem 4 moradores que estão na escola, sendo 2 em particular e
2 em pública. Analogamente, a casa 2 tem 3 moradores em escola, 2 em particular e 1 em
publica. Finalmente, a casa 3 tem 4 pessoas na escola e todas em particular.
Eu quero uma nova matiz com a primeira coluna indicando a casa; a segunda indicando o
número de crianças na casa ; a terceira indicando o número das que estão em escola particular e
Finalmente, a quarta, indicando o numero de crianças em escola pública. Algo assim:
>matrix1
 > Casa em_escola part publ
 1 4 2 2
2 3 2 1
3 4 4 0
Eu fiz um código que mostrarei a seguir. O problema deste código é que a minha matriz original
é muito grande e demora horas para rodar. Além disso, preciso fazer a mesma coisa para outras
matrizes. A seguir, meu código
lista1<- unique(Data$Casa)
length(lista1)
n=length(lista1)
lista_aux<- c(1:n)
matrix1<- data.frame(lista_aux,lista1)
nrow(matrix1)
for(i in 1:n)
{
matrix = subset(Data , control_uc == lista1[i] )
matrix1$em_escola[i] <- nrow(matrix)
mat1<- subset (matrix, Escola == "1" )
matrix1$part[i]<- nrow(mat1)
mat2<- subset(matrix, cod_freq_escola =="2" )
matrix1$publ[i]<- nrow(mat2)
}
matrix1 é a matriz que eu quero... Mas como eu disse, preciso de um código bem mais rápido do
que isso.. pois demora muito na hora de rodar em base de dados muito grande
Pergunta[25]de orrillo[26]
Resposta 1
Você pode usar a biblioteca dplyr para tornar seu código mais simples e, ao mesmo tempo, mais
eficiente:
library(dplyr)
Data <- data.frame(Casa=c(1,1,1,1,2,2,2,3,3,3,3),
Escola=c(1,1,2,2,1,2,1,1,1,1,1))
matrix1 <- Data %>%
 group_by(Casa) %>%
 summarise(em_escola = n(),
 part = sum(Escola == 1),
 publ = sum(Escola == 2))
matrix1
Resposta de rodrigorgs[27] 
Resposta 2
Para complementar, deixo também uma resposta com o data.table. Tanto o dplyr quanto o
data.table são extremamente rápidos para grandes base de dados. O dplyr é, na minha opinião,
mais intuitivo e o data.table é mais flexível.
library(data.table)
Data <- data.table(Data)
matrix1 <- Data[,list(em_escola = length(Escola),
 part=sum(Escola==1),
 publ = sum(Escola==2)), by=Casa]
Resposta de Carlos Cinelli[28] 
Voltar para o Sumário
* * *
http://cran.r-project.org/web/packages/dplyr/index.html
http://cran.r-project.org/web/packages/data.table/index.html
Em R, uma função que leia apenas algumas colunas de um
dataframe em formato Rda
Eu tenho 27 arquivos txt. Cada arquivo representa um estado do brasil. Na verdade, cada arquivo
é dataframe sobre mercado de trabalho. Os 27 arquivos podem somar mais de 20 gigas. A
primeira coisa que eu fiz para reduzir isto foi salvar cada arquivo em formato Rda. Com isto, por
exemplo, 20 gigas de memória podem ser reduzidos para aproximadamente 3 gigas. Isto é muito
bom, mas o grande problema é que muitas vezes eu não preciso ler todas as variáveis do
dataframe (aproximadamente, 40 variáveis no total) . Por exemplo, no caso do txt, eu posso usar
a função fread para ler apenas 3 variáveis:
fread("data.txt", select = c("var1","var2","var3") )
Lamentavelmente, não encontrei uma versão para o caso rda. Resolvi então criar uma função que
me permita ler apenas algumas colunas. Tomemos como exemplo um arquivo dos 27: RJ.txt. A
ideia é quebrar este dataframe por colunas, salvar cada coluna em formato Rda e guardar tudo em
uma pasta. Criei então uma função para fazer isto:
df <- fread ( "RJ.txt") # Leio o arquivo original
arquivo_pasta<- "C:/Meu diretorio/pastaRJ" # Esta é a minha pasta onde vou guardar todas as variáveis.
# Esta é a minha função para salvar
save2<- function(df , arquivo_pasta )
{
dfl <- as.list(df) # nossa matrix agora é uma lista
remove(df)
setwd(arquivo_pasta)
for( i in 1:length(dfl))
{
 v <- dfl[[i]] 
 save( v , file = paste0( names(dfl)[i], ".Rda" ) ) #salvamos
}
}
Desta maneira, eu tenho uma pasta com as 40 colunas de RJ.txt, cada uma em formato rda.
Agora eu crio uma função para ler apenas algumas colunas
read2 <- function(arquivo_pasta , colunas)
{
 setwd(arquivo_pasta)
# Vamos criar uma matriz, com uma variável auxiliar para poder selecionar apenas as variáveis que queremos
(path<- list.files(path = arquivo_pasta, all.files = T , full.names = T ))
 path<- as.data.frame(path)
# Criamos a variável auxiliar com apenas o nome da variável
 path$aux<- gsub(arquivo_pasta, "" , path$path)
 path$aux<- gsub("/", "" , path$aux)
 path$aux<- gsub(".Rda", "" , path$aux)
# Finalmente, selecionamos as colunas
 path <- subset(path , aux %in% colunas )
# Criamos uma variável auxiliar para poder iniciar o empilhamento
 df_ret <- 1
for(i in 1:nrow(path))
{
 load(as.character(path$path[i]))
 dfaux<- data.table(v)
 names(dfaux) <- as.character(path$aux[i])
 df_ret<- cbind(df_ret, dfaux)
}
# Excluímos a variável auxiliar 
 df_ret<- df_ret[,df_ret:=NULL]
return(df_ret)
}
Como vocês podem imaginar, estou fazendo isto porque eu quero me livrar de todos os arquivos
txt. O problema é que eu quero fazer isto um pouco mais eficiente e mais rápido. Gostaria de
saber se vocês tem alguma ideia de como melhor isto, principalmente, em questão de tempo.
Pergunta[29]de orrillo[30]
Resposta:
Uma boa solução é usar o pacote fst. Note que ele não é ideal para armazenamento a logo prazo
uma vez que ainda está em intenso desenvolvimento.
Segundo o README ele comprime tão bem quanto o saveRDS, é mais rápido para ler e escrever
e de quebra permite a leitura de apenas algumas colunas.
Exemplo:
# Generate a random data frame with 10 million rows and various column types
nrOfRows <- 1e7
x <- data.frame(
Integers = 1:nrOfRows, # integer
Logicals = sample(c(TRUE, FALSE, NA), nrOfRows, replace = TRUE), # logical
Text = factor(sample(state.name, nrOfRows, replace = TRUE)), # text
Numericals = runif(nrOfRows, 0.0, 100), # numericals
 stringsAsFactors = FALSE)
# Store it
 write.fst(x, "dataset.fst")
# Retrieve it
 y <- read.fst("dataset.fst")
# Ler só algumas linhas e colunas
read.fst("dataset.fst", c("Logicals", "Text"), 2000, 4990) # subset rows and columns
https://github.com/fstpackage/fst
Resposta de Daniel Falbel[31] 
Voltar para o Sumário
* * *
Data frame
Como consolidar (agregar ou agrupar) os valores em uma base
de dados?
Suponha que eu tenha a seguinte base de dados
vendas<-c(100,140,200,300,20,1000,200,3000)
vendedor<-c("A","B","A","B","C","C","D","A")
regiao<-c("Norte","Sul","Leste","Norte","Sul","Norte","Leste","Sul")
df<-data.frame(vendedor,regiao,vendas)
E queira analisar o total de vendas por vendedor e por vendedor/região.
Como faço para gerar essa nova base com os dados agregados para análise?
Pergunta[32]derowang[33]
Resposta 1
Você pode fazer isso com a função aggregate
aggregate(vendas ~ vendedor,
 data=df,
 FUN=sum)
vendedor vendas
1 A 3300
2 B 440
3 C 1020
4 D 200
aggregate(vendas ~ vendedor + regiao,
 data=df,
 FUN=sum)
vendedor regiao vendas
1 A Leste 200
2 D Leste 200
3 A Norte 100
4 B Norte 300
5 C Norte 1000
6 A Sul 3000
7 B Sul 140
8 C Sul 20
Uma outra opção é usar o pacote plyr
library(plyr)
ddply(df,
 c("vendedor"),
 summarise,
 total = sum(vendas))
vendedor total
1 A 3300
2 B 440
3 C 1020
4 D 200
ddply(df,
 c("vendedor", "regiao"),
 summarise,
 total = sum(vendas))
vendedor regiao total
1 A Leste 200
2 A Norte 100
3 A Sul 3000
4 B Norte 300
5 B Sul 140
6 C Norte 1000
7 C Sul 20
8 D Leste 200
Resposta de Marcos Banik[34] 
Resposta 2
Outra opção é utilizar o pacote data.table:
df <- data.table(df)
df[,sum(vendas), by=vendedor]
df[,sum(vendas), by=data.table(vendedor, regiao)]
Pacotes como o plyr e o data.table foram criados para facilitar e agilizar esse (e outros) tipos
de análises, entao se o teu banco for grande ou tiver que fazer muitos agrupamentos, talvez valha
a pena dar uma estudada neles!
Resposta de Rcoster[35] 
Resposta 3
O Hadley criou recentemente o dplyr, uma versao bem mais rapida e com sintaxe mais intuitiva
que o plyr. (links para o CRAN e para o anuncio no blog do RStudio)
No dplyr ficaria assim
library(dplyr)
group_by(df,vendedor)%>%summarise(Total=sum(vendas))
 vendedor Total
1 A 3300
2 B 440
3 C 1020
4 D 200
http://cran.r-project.org/web/packages/data.table/index.html
http://cran.r-project.org/web/packages/dplyr/index.html
http://blog.rstudio.org/2014/01/17/introducing-dplyr/
E agrupando por vendedor e regiao
group_by(df,vendedor, regiao)%>%summarise(Total=sum(vendas))
 vendedor regiao Total
1 A Leste 200
2 A Norte 100
3 A Sul 3000
4 B Norte 300
5 B Sul 140
6 C Norte 1000
7 C Sul 20
8 D Leste 200
Edição: a versão mais recente do dplyr usa o operador %>% do magrittr.
Resposta de Carlos Cinelli[36] 
Resposta 4
Você também pode utilizar tapply:
Por vendedor:
with(df, tapply(vendas, vendedor, sum))
A B C D 
3300 440 1020 200
Por vendedor e região:
with(df, tapply(vendas, list(vendedor, regiao), sum))
Leste Norte Sul
A 200 100 3000
B NA 300 140
C NA 1000 20
D 200 NA NA
Resposta de Carlos Cinelli[37] 
Voltar para o Sumário
* * *
Erro ao converter números. Como converter fatores para
números?
No seguinte exemplo:
dados <- data.frame(x=c("11", "10", "20", "15"), y=c("25", "30", "35", "40"))
dados
 x y
1 11 25
2 10 30
3 20 35
4 15 40
Ao tentar transformar a variável x em número, ao invés de 11, 10, 20 15 aparecem:
as.numeric(dados$x)
[1] 2 1 4 3
Como converter x para números?
Pergunta[38]de Carlos Cinelli[39]
Resposta 1
No R, o comportamento padrão do data.frame é transformar textos em fatores. Isso pode gerar
resultados inesperados quando números, durante o processo de importação/manipulação de
dados, são erroneamente interpretados como textos e transformados em fatores.
Em geral, ao trabalhar com data.frames, é interessante colocar a opção stringsAsFactors =
FALSE para evitar que variáveis que não devem ser tratadas como fatores o sejam.
Entretanto, uma vez que a variável tenha sido indevidamente transformada em fator, uma solução
possível é convertê-la em character primeiro antes de passar para número:
as.numeric(as.character(dados$x))
[1] 11 10 20 15
Resposta de Carlos Cinelli[40] 
Resposta 2
Se você analisar a estrutura do objeto verá onde ocorre o problema:
str(unclass(dados$x))
atomic [1:4] 2 1 4 3
- attr(*, "levels")= chr [1:4] "10" "11" "15" "20"
O objeto dados$x é composto do vetor [2,1,4,3] com o atributo levels. Esse atributo que
aparece no console quando é feito o print de dados$x.
Para resolver o problema, além da solução já mencionada, você pode adotar a seguinte solução:
as.numeric(levels(dados$x))[dados$x]
Na primeira parte da solução são extraídos e convertidos em número os atributos do objeto
dados$x. O R automaticamente coloca esses valores em ordem crescente. Então você usa
[dados$x] para deixá-los na ordem original.
Essa solução é ligeiramente mais eficiente do que as.numeric(as.character(dados$x)),
entretanto pode ser mais difícil de lembrar.
Resposta de rowang[41] 
Voltar para o Sumário
* * *
Procurar valores em um data.frame e adicionar em outro (R)
Eu tenho 2 data.frames, o primeiro é um data.frame que contem dados de ações e uma coluna
com um identificador único (coluna "ISIN"), conforme exemplo abaixo:
Teste=data.frame(matrix(runif(20), nrow=5, ncol=4))
Teste$ISIN <- c("A1","A2","A3","A4","A5")
colnames(Teste) <- c("AVG_VOLUME","AVG_RETURN","VOL","PRICE","ISIN")
AVG_VOLUME AVG_RETURN VOL PRICE ISIN
Stock 1 0.7028197 0.09264265 0.002169411 100 A1
Stock 2 0.7154557 0.03314615 0.004839466 100 A2
Stock 3 0.4038030 0.04347487 0.003441471 100 A3
Stock 4 0.5392530 0.06414982 0.004482528 100 A4
Stock 5 0.8720084 0.09615865 0.008081017 100 A5
Meu segundo data.frame possui uma coluna "ISIN" porém não são unicos, conforme exemplo
abaixo :
Teste2 <- data.frame(matrix(runif(10), nrow=5, ncol=2))
Teste2$ISIN <- c("A1","A1","A3","A2","A2")
X1 X2 ISIN
1 0.0273074 0.6829592 A1
2 0.1928437 0.3768154 A1
3 0.9693224 0.3331828 A3
4 0.9434274 0.1549707 A2
5 0.6211476 0.3360101 A2
O que eu gostaria de fazer é buscar no data.frame Teste o valor da coluna "AVG_VOLUME"
correspondente ao "ISIN"do data.frame Teste2 e adicionar essa informação como uma coluna
nova em Teste2, resultando em :
X1 X2 ISIN AVG_VOLUME
1 0.0273074 0.6829592 A1 0.7028197
2 0.1928437 0.3768154 A1 0.7028197
3 0.9693224 0.3331828 A3 0.4038030
4 0.9434274 0.1549707 A2 0.7154557
5 0.6211476 0.3360101 A2 0.7154557
Qual a melhor maneira de obter esse resultado, tipo um PROCV no excel ?
Pergunta[42]de RiskTech[43]
Resposta 1
merge é a função que você está procurando - ela pode unir dois data frames. Como você só quer
uma coluna do primeiro data frame, você pode filtrá-lo para ter apenas ela:
Teste=data.frame(matrix(runif(20), nrow=5, ncol=4))
Teste$ISIN <- c("A1","A2","A3","A4","A5")
colnames(Teste) <- c("AVG_VOLUME","AVG_RETURN","VOL","PRICE","ISIN")
Teste2 <- data.frame(matrix(runif(10), nrow=5, ncol=2))
Teste2$ISIN <- c("A1","A1","A3","A2","A2")
Teste3 <- merge(Teste[,c("ISIN", "AVG_VOLUME")], Teste2, by = "ISIN")
Resposta de carlosfigueira[44] 
Resposta 2
Usando dplyr você pode fazer assim:
> library(dplyr)
> Teste3 <- left_join(Teste2, Teste %>% select(ISIN, AVG_VOLUME))
Joining by: "ISIN"
> Teste3
 X1 X2 ISIN AVG_VOLUME
1 0.5896936 0.1847698 A1 0.3473872
2 0.9254054 0.1172393 A1 0.3473872
3 0.3235616 0.3382006 A3 0.1330457
4 0.8382510 0.6392993 A2 0.9750695
5 0.3537203 0.7187851 A2 0.9750695
Você poderia especificar o argumento by na função left_join se as colunas nos dois
data.frames não tivessem o mesmo nome:
Teste3 <- left_join(Teste2, Teste %>% select(ISIN, AVG_VOLUME),
by = c("ISIN" = "ISIN"))
Se você quisesse trazer todas as colunas do outro banco, poderia fazer o seguinte:
> Teste3 <- left_join(Teste2, Teste,
+ by = c("ISIN" = "ISIN"))
> Teste3
 X1 X2 ISIN AVG_VOLUME AVG_RETURN VOL PRICE
1 0.5896936 0.1847698 A1 0.3473872 0.1309524 0.6389297 0.3433055
2 0.9254054 0.1172393 A1 0.3473872 0.1309524 0.6389297 0.3433055
3 0.3235616 0.3382006 A3 0.1330457 0.2889567 0.3713113 0.8803770
4 0.8382510 0.6392993 A2 0.9750695 0.1394496 0.5789795 0.7136534
5 0.3537203 0.7187851 A2 0.9750695 0.1394496 0.5789795 0.7136534
Acho legal deixar aqui o bechmark das soluções também. A solução usando dplyr é cerca de 2x
mais rápida conforme a tabela abaixo:
> microbenchmark::microbenchmark(
+ merge = merge(Teste, Teste2, by = "ISIN"),
+ left_join = left_join(Teste2, Teste, by = "ISIN")
+ )
Unit: microseconds
 expr min lq mean median uq max neval
 merge 738.565 773.4590 927.1096 792.249 816.673 13732.206 100
left_join 287.354 307.5555 323.3633 316.747 327.374 671.206 100
Resposta de Daniel Falbel[45]Voltar para o Sumário
* * *
Deletar linhas que contém NA em um data frame
Tenho um data frame e na quarta coluna há diversas células NA. Gostaria de saber como posso
deletar todas as linhas que tenham NA. Utilizei esse comando mas eles continuam aparecendo
dataframe1
r <- with(dataframe1, which(dataframe1[4]==NA, arr.ind=TRUE))
newd <- dataframe1[-r, ]
A estrutura dos meus dados é:
dput(head(dataframe1, 10))
structure(list(Sigla = c("AC", "AC", "AC", "AC", "AC", "AC",
"AC", "AC", "AC", "AC"), Código = c(1200013L, 1200054L, 1200104L,
1200138L, 1200179L, 1200203L, 1200252L, 1200302L, 1200328L, 1200336L
), MunicÃ.pio = c("Acrelândia", "Assis Brasil", "Brasiléia",
"Bujari", "Capixaba", "Cruzeiro do Sul", "Epitaciolândia", "Feijó",
"Jordão", "Mâncio Lima"), `numero de homicidios` = c(4L, NA,
1L, NA, 1L, 1L, NA, 1L, NA, 1L), `media escolaridade` = c(3.268,
3.72, 3.788, 2.816, 2.417, 4.108, 3.681, 1.948, 1.038, 3.537), 
 rendimento = c(1042.3834261349, 429.2221666106, 2243.2492197717,
786.6815828794, 603.835515482, 9363.3159742031, 1503.420009265,
1737.0793588989, 130.7838314018, 1040.2388777272), populacao = c(7935L,
3490L, 17013L, 5826L, 5206L, 67441L, 11028L, 26722L, 4454L,
11095L)), .Names = c("Sigla", "Código", "MunicÃ.pio", "numero de homicidios",
"media escolaridade", "rendimento", "populacao"), row.names = c(NA,
10L), class = "data.frame")
Pergunta[46]de user7004[47]
Resposta:
Há duas soluções. Se você quiser omitir todos os NA do data.frame, você pode usar a função
na.omit.
Por exemplo, suponha um data.frame com duas colunas, em que há NA's nas duas.
### Construindo um data.frame de exemplo ###
set.seed(1)
df <- data.frame(x=rnorm(100), y = rnorm(100))
df[sample(1:100,20),1] <- NA
df[sample(1:100,20),2] <- NA
O comando na.omit vai retirar todas as linhas que tenham pelo menos um NA:
df2 <- na.omit(df)
Mas se você quiser omitir apenas as linhas que possuem NA em uma coluna específica, você
pode usar a função is.na para fazer o subset do data.frame. A função is.na retorna TRUE se o
valor for NA, deste modo você vai negar ! o resultado no subset.
Por exemplo, o comando abaixo retira apenas as linhas que tem NA em x:
df3 <- df[!is.na(df$x),]
Resposta de Carlos Cinelli[48] 
Voltar para o Sumário
* * *
Como formatar uma tabela (data.frame) com qualidade de
publicação em pdf (latex) no R?
Suponha a seguinte tabela:
tabela <- structure(list(Sexo = structure(c(1L, 1L, 2L, 2L), .Label = c("Homem",
"Mulher"), class = "factor"), Grupo = structure(c(1L, 2L, 1L,
2L), .Label = c("A", "B"), class = "factor"), Média = c(0.2655086631421,
0.37212389963679, -0.835628612410047, 1.59528080213779), Var = c(0.329507771815361,
0.820468384118015, 0.572853363351896, 0.908207789994776)), .Names = c("Sexo",
"Grupo", "Média", "Var"), row.names = c(NA, -4L), class = "data.frame")
tabela
 Sexo Grupo Média Var
1 Homem A 0.2655087 0.3295078
2 Homem B 0.3721239 0.8204684
3 Mulher A -0.8356286 0.5728534
4 Mulher B 1.5952808 0.9082078
Como deixá-la em formato de publicação, para um arquivo em pdf (usando latex por exemplo)?
Pergunta[49]de Carlos Cinelli[50]
Resposta 1
Você pode usar o pacote xtable. Primeiro, é necessário baixar o pacote. No R, entre com o
seguinte comando:
install.packages("xtable")
Depois de instalado, carregue-o:
library("xtable")
Coloque a sua tabela no formato data.frame e aplique o comando:
xtable(tabela)
Resposta de Yamaneko[51] 
Resposta 2
Um pacote que eu acho fantástico é o tables. Ele é bem flexível. Por exemplo, arrumando a
tabela de três formas diferentes:
library(tables)
tabela1 <- tabular(~(Sexo)*Heading()*Grupo*Heading()*identity*(Média+Var), data=tabela)
tabela2 <- tabular((Sexo)~(Grupo)*Heading()*identity*(Média+Var), data=tabela)
tabela3 <- tabular(Sexo*Grupo~Heading()*identity*(Média+Var), data=tabela)
Para gerar o código latex:
latex(tabela1)
latex(tabela2)
latex(tabela3)
Resultados:
Resposta de Carlos Cinelli[52] 
Resposta 3
Pode também usar o pacote stargazer
library(stargazer)
stargazer(tabela, summary=FALSE)
Resultado:
Resposta de rowang[53] 
Voltar para o Sumário
* * *
Como fazer um gráfico condicional y~x para cada fator do
data.frame?
Suponha um data.frame como o seguinte:
set.seed(1)
dados <- data.frame(w=rep(c("A", "B", "C", "D"), 50), y= rnorm(200), x=rnorm(200),
 stringsAsFactors=FALSE)
Como criar um gráfico y~x separado por cada categoria de w?
Pergunta[54]de Carlos Cinelli[55]
Resposta 1
Uma maneira é usar a função coplot:
coplot(y~x |w, data=dados)
Também é possível fazer com o ggplot2 usando facet_wrap:
library(ggplot2)
ggplot(data=dados, aes(y=y, x=x))+ geom_point(aes(color=w))+facet_wrap( ~ w)
Resposta de Carlos Cinelli[56] 
Resposta 2
Pode também usar a biblioteca lattice para isso.
library(lattice)
xyplot(y~x|w, data=dados)
Resposta de rowang[57] 
Voltar para o Sumário
* * *
O que são dados no formato wide/long?
É comum ler/ouvir comentários dizendo que os dados estão no formato wide ou long.
1. O que quer dizer que uma tabela está em formato wide? E long?
2. Quais pacotes/funções no R podem ser usados para transformar uma tabela wide em long e
vice-e-versa?
Existe essa pergunta, mas ela está restrita a um dos casos e apenas a sua operacionalização, sem
entrar em questões conceituais.
Pergunta[58]de Tomás Barcellos[59]
Resposta:
1. Diferença entre wide e long
Wide format
No formato amplo (wide format), as respostas de um mesmo indivíduos estarão em uma única
linha e cada resposta estará em uma coluna separada.
Por exemplo, no seguinte conjunto de dados, cada condado foi medido em quatro pontos de
tempo, uma vez a cada 10 anos, a partir de 1970. A variável de resultado é Jobs e indica o
número de empregos em cada condado. Existem três variáveis ​​preditoras: Área da Terra,
Amenidade Natural (4 = não e 3 = Sim) e a proporção da população do condado naquele ano que
se formou no College.
Como a área da terra e a presença de uma amenidade natural não mudam de década para década,
esses preditores têm apenas uma variável por município. Mas tanto o nosso resultado, Jobs, e um
preditor, College, têm valores diferentes em cada ano, por isso exigem uma variável diferente
(coluna) para cada ano.
Long format
No formato longo (long format), cada linha é um ponto de tempo por assunto. Portanto, cada
sujeito (condado) terá dados em várias linhas. Todas as variáveis ​​que não mudam ao longo do
tempo terão o mesmo valor em todas as linhas.
https://pt.stackoverflow.com/questions/231749/
Você pode ver os mesmos dados dos cinco condados abaixo no formato longo. Cada condado
tem quatro linhas de dados - uma para cada ano.
Todas as mesmas informações estão lá; nós apenas configuramos os dados de forma diferente.
Não precisamos mais de quatro colunas para Jobs ou College. Em vez disso, todos os quatro
valores de Jobs para cada condado estão empilhados. Eles estão todos na coluna Jobs. O mesmo
vale para os quatro valores do College.
Mas, para acompanhar qual observação ocorreu em que ano, precisamos adicionar uma variável
Year.
Você notará que as variáveis ​​que não mudaram de ano para ano - Área da Terra e Amenidade
Natural - têm o mesmo valor em cada uma das quatro linhas de cada condado. Parece estranho,
mas não há problema em ter isso desse jeito e, desde que você analise os dados usando os
procedimentos corretos, levará em conta que eles são redundantes.
Fonte
https://www.theanalysisfactor.com/wide-and-long-data/
2. Pacotes
tidyr - Funções: gather (formato wide para long) e spread (formato long para wide)
reshape2 - Funções: melt (formato wide para long) e dcast (formato long para wide)
base - Função: reshape
3. Materiais adicionais: link1; link2
Resposta de Rafael Cunha[60] 
Voltar para o Sumário
* * *
http://www.cookbook-r.com/Manipulating_data/Converting_data_between_wide_and_long_format/
https://seananderson.ca/2013/10/19/reshape/
Criar coluna com soma e percentual do máximo de outras
colunas
eu sou iniciante na linguagem R e queriasaber como eu faço para criar uma função mutate que
crie uma nova coluna na minha tabela e ao mesmo tempo armazene nessa nova coluna a soma
dos valores contidos em outras 6 colunas da minha tabela como no exemplo abaixo, além disso
queria criar uma outra coluna chamada proporcao do lado da coluna Soma_total que pegasse o
maior número presente entre as colunas A e F e o dividisse pelo valor contido na coluna
Soma_total. Por exemplo, na primeira linha da coluna proporcao eu teria 100 (maior valor entre
as colunas A e F)/150 (valor contido na coluna Soma_total).
Detalhes importantes: as colunas de A: F estão com o tipo character e possuo uma série de NA's
nessas colunas que eu gostaria de desconsiderar na hora de fazer a minha soma.
A B C D E F Soma_total Proporcao
100 50 NA NA NA NA 150 (100/150)
49 51 1 NA NA NA 101 (51/101)
30 20 5 1 NA NA 56 (30/56)
11 10 2 NA NA NA 23 (11/23)
7 3 5 1 1 1 18 (7/18)
0 10 NA NA NA NA 10 (10/10)
1 2 NA NA NA NA 3 (2/3)
5 6 2 NA NA NA 13 (6/13)
7 3 1 3 1 NA 15 (7/15)
12 3 1 2 NA NA 18 (12/18)
Pergunta[61]de Garbes[62]
Resposta 1
recriando a tabela em code (para todos poderem reproduzir o exemplo):
dt_so_bruna <- 
structure(list(A = c(100, 49, 30, 11, 7, 0, 1, 5, 7, 12), B = c(50,
51, 20, 10, 3, 10, 2, 6, 3, 3), C = c(0, 1, 5, 2, 5, 0, 0, 2,
1, 1), D = c(0, 0, 1, 0, 1, 0, 0, 0, 3, 2), E = c(0, 0, 0, 0,
1, 0, 0, 0, 1, 0), F = c(0, 0, 0, 0, 1, 0, 0, 0, 0, 0)), .Names = c("A",
"B", "C", "D", "E", "F"), row.names = c(NA, 10L), class = "data.frame")
solucao com duas linhas de mutate() :
dt_so_bruna %>%
 mutate(Soma = A + B + C + D + E + F) %>%
 mutate(Proporcao_A = pmax(A, B, C, D, E, F, na.rm = TRUE) / Soma)
A B C D E F Soma Proporcao_A
1 100 50 0 0 0 0 150 0.6666667
2 49 51 1 0 0 0 101 0.4851485
3 30 20 5 1 0 0 56 0.5357143
4 11 10 2 0 0 0 23 0.4782609
5 7 3 5 1 1 1 18 0.3888889
6 0 10 0 0 0 0 10 0.0000000
7 1 2 0 0 0 0 3 0.3333333
8 5 6 2 0 0 0 13 0.3846154
9 7 3 1 3 1 0 15 0.4666667
10 12 3 1 2 0 0 18 0.6666667
Assumi que seus NAs eram 0
Resposta de Dan[63] 
Resposta 2
Uma alternativa:
library(dplyr)
dados3 <- dados %>%
 mutate_at(c("A", "B", "C", "D", "E", "F"), as.numeric) %>%
 mutate(Soma_total_2 = data_frame(A, B, C, D, E, F) %>% rowSums(na.rm = TRUE),
Maximo = pmax(A, B, C, D, E, F, na.rm = TRUE),
Proporcao_2 = sprintf("(%s/%s)", Maximo, Soma_total_2))
Funções novas aí são
mutate_at - aplica a mesma transformação para colunas especificadas.
rowSums - Soma valores de cada linha de uma matriz ou data.frame.
pmax - Pega o máximo de cada linha de uma matriz ou data.frame.
sprintf - formata textos.
Abraços!
Resposta de Athos[64] 
Voltar para o Sumário
* * *
Como remover uma coluna do data.frame em R?
Suponha um data.frame genérico, tal como:
set.seed(1)
dados <- data.frame(y=rnorm(100), x= rnorm(100), z=rnorm(100), w=rnorm(100))
head(dados)
 y x z w
1 -0.6264538 -0.62036668 0.4094018 0.8936737
2 0.1836433 0.04211587 1.6888733 -1.0472981
3 -0.8356286 -0.91092165 1.5865884 1.9713374
4 1.5952808 0.15802877 -0.3309078 -0.3836321
5 0.3295078 -0.65458464 -2.2852355 1.6541453
6 -0.8204684 1.76728727 2.4976616 1.5122127
Como faço para excluir colunas do data.frame?
Pergunta[65]de Carlos Cinelli[66]
Resposta:
Há várias formas de se fazer isso.
A mais simples é atribuir NULL à coluna, por exemplo, para remover a coluna x:
dados$x <- NULL
head(dados)
 y z w
1 -0.6264538 0.4094018 0.8936737
2 0.1836433 1.6888733 -1.0472981
3 -0.8356286 1.5865884 1.9713374
4 1.5952808 -0.3309078 -0.3836321
5 0.3295078 -2.2852355 1.6541453
6 -0.8204684 2.4976616 1.5122127
Também é possível deletar várias de uma vez colocando o sinal de menos nas colunas que você
não quer que sejam selecionadas, por exemplo, para excluir a primeira e terceira coluna:
dados<-dados[,-c(1,3)]
head(dados)
 x w
1 -0.62036668 0.8936737
2 0.04211587 -1.0472981
3 -0.91092165 1.9713374
4 0.15802877 -0.3836321
5 -0.65458464 1.6541453
6 1.76728727 1.5122127
Outra forma é referenciar as colunas pelo nome, criando um vetor de colunas a serem excluídas e
deixando no data.frame apenas aquelas colunas que não estão neste vetor:
excluir <- c("x", "y")
dados <- dados[,!(names(dados)%in% excluir)]
head(dados)
 z w
1 0.4094018 0.8936737
2 1.6888733 -1.0472981
3 1.5865884 1.9713374
4 -0.3309078 -0.3836321
5 -2.2852355 1.6541453
6 2.4976616 1.5122127
Resposta de Carlos Cinelli[67] 
Voltar para o Sumário
* * *
Como calcular a mediana de uma linha em um data.frame no R?
Tenho um banco de dados e o meu objetivo é realizar algumas análises de comportamento de
classes por linha.
Exemplo:
print(DADOS)
Linha A B C D E
L1 4 3 2 2 4
L2 1 11 1 1 1
L3 0 1 2 3 4
L4 2 0 0 8 0
Usando o exemplo acima, para analisar as classes A, B, C, D e E, a princípio eu usei a Soma e a
Média de cada linha. Sendo a melhor forma ou não, para calcular a Soma e a Média eu usei a
função mutate da seguinte maneira:
DADOS = DADOS %>%
select(Linha:E) %>%
mutate(Soma = (A+B+C+D+E)) %>%
mutate(Média = Soma/5)
E a minha base de dados ficou assim:
print(DADOS)
Linha A B C D E Soma Média
 L1 4 3 2 2 4 15 3
 L2 1 11 1 1 1 15 3
 L3 0 1 2 3 4 10 2
 L4 2 0 0 8 0 10 2
No exemplo acima podemos verificar que apesar das linhas possuírem dados diferentes, as linhas
L1 e L2 possuem a Soma e a Média idênticas, o mesmo acontece com a Soma e a Média das linhas
L3 e L4.
Como a Soma e a Média não foram tão efetivas, podemos incluir mais um outro cálculo para a
análise: a Mediana.
Como funciona a Mediana?
Na prática, a Mediana ordena um conjunto de dados e identifica o seu elemento central.
Exemplo:
L4 = {2, 0, 0, 8, 0}
Ordenando L4 = {0,0,0,2,8}
Mediana L4 = 0
A Mediana divide um conjunto de dados em partes iguais, afim de encontrar uma tendência de
distribuição mais assertiva. O uso da Mediana é ideal para identificar valores em seu conjunto de
dados que fogem do padrão, os famosos "fora de série".
Sabendo disso, a questão é: Como posso calcular a Mediana de uma linha em um data.frame?
Pergunta[68]de Izak Mandrak[69]
Resposta 1
Um pouco da explicação está aqui.
Reproduzindo os dados
library(tidyverse)
txt <- "Linha A B C D E
L1 4 3 2 2 4
L2 1 11 1 1 1
L3 0 1 2 3 4
L4 2 0 0 8 0"
DADOS <- as_tibble(
 read.table(text = txt, header = TRUE)
)
E então basta usar o transpose() para aplicar a median() para cada linha.
DADOS %>% 
 mutate(
 linhas = DADOS %>% select(-1) %>% 
 transpose() %>% map(unlist),
 mediana = map_dbl(linhas, median)
) %>%
select(-linhas)
# A tibble: 4 x 7
Linha A B C D E mediana
 <fct> <int> <int> <int> <int> <int> <dbl>
1 L1 4 3 2 2 4 3
2 L2 1 11 1 1 1 1
3 L3 0 1 2 3 4 2
4 L4 2 0 0 8 0 0
Resposta de Tomás Barcellos[70] 
Resposta 2
Uma solução pode ser a seguinte.
library(dplyr)
DADOS %>%
 rowwise() %>%
 mutate(Soma = (A + B + C + D + E),
 Média = Soma/5,
Mediana = median(c(A, B, C, D, E)))
#Source: local data frame [4 x 9]
#Groups: <by row>
#
https://pt.stackoverflow.com/a/363177/43953
## A tibble: 4 x 9
# Linha A B C D E Soma Média Mediana
# <fct> <int> <int> <int> <int> <int> <int> <dbl> <int>
#1 L1 4 3 2 2 4 15 3 3
#2 L2 1 11 1 1 1 15 3 1
#3 L3 0 1 2 3 4 10 2 2
#4 L4 2 0 0 8 0 10 2 0
Dados.
DADOS <- read.table(text = "
Linha A B C D E
L1 4 3 2 2 4
L2 1 11 1 1 1
L3 0 1 2 3 4
L4 2 0 0 8 0 
", header = TRUE)
Resposta de Rui Barradas[71] 
Resposta 3
Uma alternativa que surgiu recentemente é usar o pacote rap:
library(tidyverse)
#> Warning: package 'tibble' was built under R version 3.5.2
library(rap)
txt <- "Linha A B C D E
L1 4 3 2 2 4
L2 1 11 1 1 1
L3 0 1 2 3 4
L4 2 0 0 8 0"
DADOS <- as_tibble(
 read.table(text = txt, header = TRUE)
)
DADOS %>% 
 rap(
 soma = numeric() ~ A + B + C + D + E,
 media = numeric() ~ mean(c(A, B, C, D, E)),
 mediana = numeric() ~ median(c(A, B, C, D, E))
)
#> # A tibble: 4 x 9
#> Linha A B C D E soma media mediana
#> <fct> <int> <int> <int> <int> <int> <dbl> <dbl> <dbl>
#> 1 L1 4 3 2 2 4 15 3 3
#> 2 L2 1 11 1 1 115 3 1
#> 3 L3 0 1 2 3 4 10 2 2
#> 4 L4 2 0 0 8 0 10 2 0
Created on 2019-02-19 by the reprex package (v0.2.1)
A vantagem do rap em relação ao rowise é que ele permite especificar o tipo do output, o que
pode te ajudar a evitar alguns erros.
https://github.com/romainfrancois/rap
https://reprex.tidyverse.org
Existe um repositório com bastante informação legal sobre Row Oriented Workflows aqui.
No seu caso eu não descartaria o gather + group_by também, apesar de isso não colocar as
colunas exatamente na ordem que vc precisa.
DADOS %>% 
 gather(k, v, A:E) %>% 
 group_by(Linha) %>% 
 summarise(
 soma = sum(v),
 media = mean(v),
 mediana = mean(v)
) %>% 
 right_join(DADOS, by = "Linha")
Resposta de Daniel Falbel[72] 
Voltar para o Sumário
* * *
https://github.com/jennybc/row-oriented-workflows
Como ordenar um data.frame por colunas no R?
Suponha um data.frame com valores numéricos e strings:
set.seed(1)
dados <- data.frame(w=rep(c("A", "B"), 2), x= rep(c("D", "C"), 2), y= rnorm(4), z=rnorm(4),
 stringsAsFactors=FALSE)
dados
w x y z
1 A D -0.6264538 0.3295078
2 B C 0.1836433 -0.8204684
3 A D -0.8356286 0.4874291
4 B C 1.5952808 0.7383247
Como faço para ordenar o data.frame por uma coluna? E como faço para ordenar com mais de
uma coluna, e cada uma com ordens diferentes (algumas em ordem crescente, outras em ordem
decrescente)?
Pergunta[73]de Carlos Cinelli[74]
Resposta 1
Pode também utilizar o pacote plyr para a ordenação.
library(plyr)
arrange(dados,desc(z))
 w x y z
1 B C 1.5952808 0.7383247
2 A D -0.8356286 0.4874291
3 A D -0.6264538 0.3295078
4 B C 0.1836433 -0.8204684
O arrange também funciona para texto sem precisar da função auxiliar xtfrm
arrange(dados,desc(w),z)
 w x y z
1 B C 0.1836433 -0.8204684
2 B C 1.5952808 0.7383247
3 A D -0.6264538 0.3295078
4 A D -0.8356286 0.4874291
Outra opção interessante é usar o pacote sqldf. O default de sql é ordem ascendente.
library(sqldf)
sqldf("SELECT w,x,y,z 
 FROM dados
 Order BY x, desc y")
 w x y z
1 B C 1.5952808 0.7383247
2 B C 0.1836433 -0.8204684
3 A D -0.6264538 0.3295078
4 A D -0.8356286 0.4874291
Resposta de rowang[75] 
Resposta 2
Da para fazer isso direto no order, basta informar multiplos parâmetros.
set.seed(1)
dados <- data.frame(w=rep(c("A", "B"), 2), x= rep(c("D", "C"), 2), y= rnorm(4), z=rnorm(4),
 stringsAsFactors=FALSE)
dados[order(dados$w, dados$x, dados$y, decreasing=c(TRUE, FALSE, TRUE)), ] # No caso, ordena de acordo por w
em ordem alfabética inversa, x em ordem alfabética e y em ordem decrescente. Se quiser que tudo seja na
mesma ordem, basta um TRUE ou FALSE, que valerá para todos.
w x y z
4 B C 1.5952808 0.7383247
2 B C 0.1836433 -0.8204684
1 A D -0.6264538 0.3295078
3 A D -0.8356286 0.4874291
Resposta de Rcoster[76] 
Voltar para o Sumário
* * *
Como filtrar um data frame?
Tenho um data frame com 5597 linhas e 7 colunas. Gostaria de filtrar os resultados desse data
frame, de forma que só apareçam as linhas em que a segunda coluna está escrito "AC". Tentei
usar o comando dr=subset(df, df[2]=="AC"), onde df é meu próprio data frame e 2 é a coluna
onde aparece "AC". Infelizmente, o comando não funcionou. Há algo que possa fazer para
melhorar o código?
Pergunta[77]de user7004[78]
Resposta:
Bom, a princípio o seu código está correto, ele deveria fazer o subset dos dados, o que pode ter
ocorrido é algum outro problema que somente seria possível verificar com o caso específico.
Mostrando em um data frame de exemplo:
set.seed(1)
df <- data.frame(valor= rnorm(100), categoria = rep(c("AB", "AC"), 50), stringsAsFactors=FALSE)
dr <- subset(df, df[2]=="AC")
Veja que dr tem apenas as linhas cuja segunda coluna é "AC":
unique(dr[2])
 categoria
2 AC
head(dr)
 valor categoria
2 0.1836433 AC
4 1.5952808 AC
6 -0.8204684 AC
8 0.7383247 AC
10 -0.3053884 AC
12 0.3898432 AC
Há diversas outras formas de filtrar um data frame. Uma delas seria usar o operador [ do R.
Exemplo:
dr <- df[df[2]=="AC", ]
ou
dr <- df[df$categoria=="AC", ]
Há também pacotes específicos para manipulação de dados. Um pacote excelente para isso é o
dplyr, pois é bastante rápido e tem uma sintaxe intuitiva (por exemplo, o comando para filtrar
chama-se "filter").
No dplyr ficaria assim:
library(dplyr)
dr <- df%>%filter(categoria=="AC")
Se você vai trabalhar muito com bases de dados, vale a pena dar uma olhada.
Resposta de Carlos Cinelli[79] 
http://cran.rstudio.com/web/packages/dplyr/vignettes/introduction.html
Voltar para o Sumário
* * *
Como ler uma tabela faltando elementos ou mal configurada?
Suponha uma tabela em forma de texto como a seguinte:
texto <- "a b c
e f
g h i"
Quando uso o comando read.table, dá o seguinte erro:
tabela <- read.table(text=texto)
Error in scan(file, what, nmax, sep, dec, quote, skip, nlines, na.strings, : 
 line 2 did not have 3 elements
Como contornar este problema?
Pergunta[80]de Carlos Cinelli[81]
Resposta:
Uma forma de resolver o problema é colocando o argumento fill=TRUE no read.table:
tabela <- read.table(text=texto, fill=TRUE)
tabela
V1 V2 V3
1 a b c
2 e f 
3 g h i
Resposta de Carlos Cinelli[82] 
Voltar para o Sumário
* * *
Como selecionar todas as variáveis do data.frame de uma vez
para uma regressão?
Suponha o seguinte data.frame:
set.seed(1) 
dados <- data.frame(y=rnorm(100), x1=rnorm(100), x2=rnorm(100), x3=rnorm(100), x4=rnorm(100))
Se eu quiser rodar uma regressão de y contra x1...xn, eu posso fazer da seguinte forma:
modelo <- lm(y~x1+x2+x3+x4, data=dados)
Nesse caso como só tem 4 variáveis, não é exaustivo descrever todas. Mas supondo que fossem
100 variáveis, isto é, de x1 até x100. Como selecionar todas de uma maneira fácil para a
regressão?
Pergunta[83]de Carlos Cinelli[84]
Resposta:
O operador . neste contexto (argumento formula da função lm) significa "todas as outras colunas
que não estão na fórmula".
Dessa forma a regressão de y contra todas as outras colunas do data.frame pode ser obtido da
seguinte forma:
modelo <- lm(y~., data=dados)
Referência: ?formula
Resposta de Dejalma[85] 
Voltar para o Sumário
* * *
Como criar um for no R com os índices de um data frame
Se tenho um data.frame:
> dato<-as.data.frame(matrix(1:64,8,8,T))[-3,]
> dato
 V1 V2 V3 V4 V5 V6 V7 V8
1 1 2 3 4 5 6 7 8
2 9 10 11 12 13 14 15 16
4 25 26 27 28 29 30 31 32
5 33 34 35 36 37 38 39 40
6 41 42 43 44 45 46 47 48
7 49 50 51 52 53 54 55 56
8 57 58 59 60 61 62 63 64
Como posso "chamar" o vector de índices (1, 2, 4, 5, 6, 7, 8)?
Pois quero utiliza-lo como índice em um for.
Pergunta[86]de Márcio Mocellin[87]
Resposta 1
O ponto chave aqui é perceber que todo for no R é executado a partir de um vetor de índices.
Veja o exemplo abaixo:
for (j in 1:5){
print(j^2)
}
[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
Para fazer este loop, eu implicitamente eu criei um vetor de índices com o comando 1:5:
1:5
[1] 1 2 3 4 5
Em particular, este vetor começa em 1 e termina em 5, com incremento de 1. Se eu tivesse feito
ele explicitamente antes de criar meu for, eu obteria o mesmo resultado:
indices <- c(1, 2, 3, 4, 5)
for (j in indices){
print(j^2)
}
[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
Portanto, o for no R está definido em cima das posições de um vetor. Este vetor pode ser o que
eu bem entender. Vamos supor que eu deseje elevar ao quadrado não os cinco primeiros números
inteiros positivos, mas os cinco primeiro números primos. Assim eu teria
indices <- c(2, 3, 5, 7, 11)
for (j in indices){
print(j^2)
}
[1] 4
[1] 9
[1] 25
[1] 49
[1] 121
Percebe como a lógica é a mesma? Eu só preciso definir corretamente o meu vetor de índices e
fazer meu contador variar nele. No teu caso, seria algo como
indices <- c(1, 2, 4, 5, 6, 7, 8)
for (j in indices){
# comandos a serem executados
}
Claro que o vetor indices poderia ter sido definido de uma maneira menos explícita. Por
exemplo, o comando
indices <- (1:8)[-3]
[1] 1 2 4 5 6 7 8
cria um vetor com os oito primeiros números inteiros positivos e retira

Continue navegando