7 Entrada de dados no R

Pode-se entrar com dados no R de diferentes formas. O formato mais adequado vai depender do tamanho do conjunto de dados, e se os dados já existem em outro formato para serem importados ou se serão digitados diretamente no R.

A seguir são descritas formas de entrada de dados com indicação de quando cada uma das formas deve ser usada. Os três primeiros casos são adequados para entrada de dados diretamente no R, os seguintes descreve como importar dados já disponíveis eletronicamentede um arquivo texto, em outro sistema ou no próprio R.

7.1 Entrando com dados diretamente no R

7.1.1 Definindo vetores

Podemos entrar com dados definindo vetores com o comando c() ("c" corresponde a concatenate) ou usando funções que criam vetores. Veja e experimente com os seguinte exemplos.

  > a1 <- c(2, 5, 8)
  > a1

  [1] 2 5 8

  > a2 <- c(23, 56, 34, 23, 12, 56)
  > a2

  [1] 23 56 34 23 12 56

Esta forma de entrada de dados é conveniente quando se tem um pequeno número de dados.

Quando os dados tem algum "padrão" tal como elementos repetidos, números sequenciais pode-se usar mecanismos do R para facilitar a entrada dos dados como vetores. Examine os seguintes exemplos.

  > a3 <- 1:10
  > a3

   [1]  1  2  3  4  5  6  7  8  9 10

  > a4 <- (1:10) * 10
  > a4

   [1]  10  20  30  40  50  60  70  80  90 100

  > a5 <- rep(3, 5)
  > a5

  [1] 3 3 3 3 3

  > a6 <- rep(c(5, 8), 3)
  > a6

  [1] 5 8 5 8 5 8

  > a7 <- rep(c(5, 8), each = 3)
  > a7

  [1] 5 5 5 8 8 8

7.1.2 Entrada via teclado

Usando a função scan() Esta função lê dados diretamento do console, isto é, coloca o R em modo prompt onde o usuário deve digitar cada dado seguido da tecla <ENTER>. Para encerrar a entrada de dados basta digitar <ENTER> duas vezes consecutivas. Veja o seguinte resultado:

  y <- scan()
  1: 11
  2: 24
  3: 35
  4: 29
  5: 39
  6: 47
  7:
  Read 6 items
  
  > y
  [1] 11 24 35 29 39 47

Este formato é mais ágil que o anterior e é conveniente para digitar vetores longos. Esta função pode também ser usada para ler dados de um arquivo ou conexão, aceitando inclusive endereços de URL’s (endereços da web) o que iremos mencionar me mais detalhes mais adiante.

Usando textConnection() Esta função generaliza a anterior permitindo que se entre com mais de um campo por linha, gravando o resultado em um data-frame(). O segunte exemplo foi postado por Henrique Dallazuanna na lista R-STAT e ilusta este uso.

  d <- read.table(textConnection("trat resposta
   a 10
   a 12
   b 15
   b 20
   c 12
   c 5
   d 8
   d 10"), header = TRUE)
  str(d)
  'data.frame': 8 obs. of  2 variables:
   $ trat    : Factor w/ 4 levels "a","b","c","d": 1 1 2 2 3 3 4 4
   $ resposta: int  10 12 15 20 12 5 8 10
   #d <- cbind(d, media = with(d, ave(d$'resposta', d$'trat', FUN = mean)))

Uso da função readLines() Este função é particularmente útil para ler entradas na forma de texto (strings). Por exemplo, para ler uma linha a ser digitada na tela do Rsiga o comando abixo e digite o texto indicado. Ao terminar pressione a tecla ENTER e o texto será armazanado no objeto texto.

  > texto <- readLines(n = 1)
  > texto

Um possível uso é dentro que funções que solicitem que o usuário responda e/ou entre com informações na medida que são solicitadas. Experimente definir e rodar o função a seguir.

  > rL.ex <- function() {
  +     cat("digite o nome do time de futebo de sua preferencia (em letras minúsculas)\n")
  +     time <- readLines(n = 1)
  +     if (time == "cruzeiro")
  +         cat("BOA ESCOLHA!!!\n")
  +     else cat("Ihh, tá mal de escolha...\n")
  +     return(invisible())
  + }
  > rL.ex()

Nesse exemplo readLines() foi utilizada para efetuar via teclado mas a função permite ainda entrada de dados por conexões com outros dispositivos de input. Por exemplo, pode ser utilizada para ler texto de um arquivo. Consulte a documentação da função para maiores detalhes e exemplos.

Corrigindo e/ou alterando dados Suponha que tenhamos digitado algum dado errado que desejamos corrigir. Por exemplo, suponha que o correto seja 25 no lugar de 35. Para corrigir basta selecionar a posição do dado atribuindo o valor correto

  > y[3] <- 25
  > y

  [1] 11 24 25 29 39 47

Vejamos ainda um outro exemplo onde todo dado acima de 30 tem seu valor alterado para 30.

  > y[y >= 30] <- 30
  > y

  [1] 11 24 25 29 30 30

7.1.3 Usando a função edit()

O comando edit(data.frame()) abre uma planilha para digitação de dados que são armazanados como data-frames. Data-frames são o análogo no R à uma planilha.

Portanto digitando

  a8 <- edit(data.frame())

será aberta uma planilha na qual os dados devem ser digitados. Quando terminar de entrar com os dados note que no canto superior direito da planilha existe um botão <QUIT>. Pressionando este botão a planilha será fechada e os dados serão gravados no objeto indicado (no exemplo acima no objeto a8).

Se voce precisar abrir novamente planilha com os dados, para fazer correções e/ou inserir mais dados use o comando fix(). No exemplo acima voce digitaria fix(a8).

Esta forma de entrada de dados é adequada quando voce tem dados que não podem ser armazenados em um único vetor, por exemplo quando há dados de mais de uma variável para serem digitados.

7.2 Lendo dados de um arquivo texto

Se os dados já estão disponíveis em formato eletrônico, isto é, já foram digitados em outro programa, voce pode importar os dados para o R sem a necessidade de digitá-los novamente.

A forma mais fácil de fazer isto é usar dados em formato texto (arquivo do tipo ASCII). Por exemplo, se seus dados estão disponíveis em uma planilha eletrônica como EXCEL ou similar, voce pode na planilha escolher a opção <SALVAR COMO> e gravar os dados em um arquivo em formato texto.

No R usa-se scan() mencionada anteriormente, ou então a função mais flexível read.table() para ler os dados de um arquivo texto e armazenar no formato de uma data-frame.

Exemplo 1: Como primeiro exemplo considere importar para o R os dados deste arquivo texto. Clique no link para visualizar o arquivo. Agora copie o arquivo para sua área de trabalho (working directory do R). Para importar este arquivo usamos:

  ex01 <- read.table("gam01.txt")
  ex01

Exemplo 2: Como primeiro exemplo considere importar para o R os dados deste arquivo texto. Clique no link para visualizar o arquivo. Agora copie o arquivo para sua área de trabalho (working directory do R).

Note que este arquivo difere do anterior em um aspecto: os nomes das variáveis estão na primeira linha. Para que o R considere isto corretamente temos que informá-lo disto com o argumento head=T. Portanto para importar este arquivo usamos:

  ex02 <- read.table("exemplo02.txt", head=T)
  ex02

Exemplo 3: Como primeiro exemplo considere importar para o R os dados deste arquivo texto. Clique no link para visualizar o arquivo. Agora copie o arquivo para sua área de trabalho (working directory do R).

Note que este arquivo difere do primeiro em outros aspectos: além dos nomes das variáveis estarem na primeira linha, os campos agora não são mais separados por tabulação e sim por :. Alm disto os caracteres decimais estão separados por vírgula, sendo que o R usa ponto pois é um programa escrito em língua inglesa. Portanto para importar corretamente este arquivo usamos então os argumentos sep e dec:

  ex03 <- read.table("dadosfic.csv", head=T, sep=":", dec=",")
  ex03

Para maiores informações consulte a documentação desta função com ?read.table.

Embora read.table() seja provavelmente a função mais utilizada existem outras que podem ser úteis e determinadas situações.

Exemplo 4: As funções permitem ler ainda dados diretamente disponíveis na web. Por exemplo os dados do Exemplo 1 poderiam ser lidos diretamente com o comando a seguir, sem a necessidade de copiar primeiro os dados para algum local no computador do usuário.:

  > read.table("http://www.leg.ufpr.br/~paulojus/dados/gam01.txt")

7.3 Lendo dados através da área de transferência

Um mecanismos comum para copiar dados de um programa psara o outro é usando a área de transferência. Tipicamente isto é feito com o mecanismo de recorta-e-cola, ou seja-se, marca-se os dados desejados em algum aplicativo (editor, planilha, página web, etc), usa-se o mecanismo de COPIAR (opção no menu do programa que muitas vezes corresponde o teclar CTRL-C), o que transfere os dados para a área de transferência. Funções como scan(), read.table() e outras podem usades apra ler os dados diretamente da área de transferência passando-se a opção "clipboard" ao primeiro argumento. Por exemplo, os seguintes dados:

  ID  Grupo  Gasto  Ano  
  23      A  25,4   11  
  12      B  12,3   09  
  23      A  19,8   07

podem ser marcados e copiados para área de transferência e lidos diretamente com: «eval=F» read.table("clipboard", header=TRUE, dec=",")

7.4 Importando dados de outros programas

É possível ler dados diretamente de outros formatos que não seja texto (ASCII). Isto em geral é mais eficiente e requer menos memória do que converter para formato texto. Há funções para importar dados diretamente de EpiInfo, Minitab, S-PLUS, SAS, SPSS, Stata, Systat e Octave. Além disto é comum surgir a necessidade de importar dados de planilhas eletrônicas. Muitas funções que permitem a importação de dados de outros programas são implementadas no pacote foreign.

  > require(foreign)

A seguir listamos (mas não todas!) algumas destas funções

Para mais detalhes consulte a documentação de cada função e/ou o manual R Data Import/Export.

7.5 Carregando dados já disponíveis no R

Para carregar conjuntos de dados que são já disponibilizados com o R use o comando data(). Por exemplo, abaixo mostramos como carregar o conjunto mtcars que está no pacote datasets e depois como localizar e carregar o conjunto de dados topo.

  > data(mtcars)
  > head(mtcars)

                     mpg cyl disp  hp drat    wt  qsec vs am gear carb
  Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
  Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
  Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
  Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
  Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
  Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

  > find("topo")

  character(0)

  > require(MASS)
  > data(topo)
  > head(topo)

      x   y   z
  1 0.3 6.1 870
  2 1.4 6.2 793
  3 2.4 6.1 755
  4 3.6 6.2 690
  5 5.7 6.2 800
  6 1.6 5.2 800

O conjunto mtcars está no pacote datasets que é carregado automaticamente quando iniciamos o R, portanto os dados estão prontamente disponíveis. Ao carregar os dados é criado um objeto mtcars no seu "workspace".

Já o conjunto topo está no pacote MASS que não é automaticamente carregado ao iniciar o R e portanto deve ser carregado com require() para depois podermos acessar os dados.

A função data() pode ainda ser usada para listar os conjutos de dados disponíveis. A primeira chamada a seguir lista os conjuntos de dados dos pacotes carregados. A segunda lista os conjuntos de dados de um pacote específico (no exemplo do pacote nlme.

  > data()
  > data(package = "nlme")

7.6 Acesso a planilhas e bancos de dados relacionais

É comum que dados estajam armazenados em planilhas eletrônicas tais como MS-Excel ou OpenOffice Spreadsheet. Nestes caso, embora seja possível exportar a partir destes aplicativos os dados para o formato texto para depois serem lidos no R, possivelmente com read.table(), pode ser necessário ou conveniente ler os dados diretamente destes formato. Vamos colocar aqui algumas opções para importar dados do MS-Excel para o R.

Estruturas de dados mais complexas são tipicamente armazenadas em acronymDBMS’s (database management system) ou acronymRDBMS’s (ralational database management system). Aguns exemplos são Oracle, Microsoft SQL server, MySQL, PostgreSQL, Microsoft Access, dentre outros. O R possuiu ferramentas implementadas em pacotes para acesso a estes sistemas gerenciadores.

Para mais detalhes consulte o manual R Data Import/Export e a documentação dos pacotes que implemental tal funcionalidade. Alguns deles disponíveis por ocasião da redação deste texto são: RODBC, DBI, RMySQL, RPostgreSQL, ROracle, RNetCDF, RSQLite, dentre outros.