Programação em R - Parte 2 (manipulações simples; números e vetores)

Programação em R - Aprenda Analtics, Big Data & Ciência de Dados


Confira todos os textos da série Programação em R:

Vetores e atribuição


R opera em estruturas de dados nomeadas. A estrutura mais simples é o vetor numérico, que é uma entidade única constituída por uma coleção ordenada de números. Para configurar um vetor chamado x, digamos, consistindo de cinco números, nomeadamente 10.4, 5.6, 3.1, 6.4 e 21.7, use o comando R

> x <- 21.7="" 3.1="" 5.6="" 6.4="" c="" p="">

Esta é uma declaração de atribuição usando a função c () que neste contexto pode ter um número arbitrário de argumentos vetoriais e cujo valor é um vetor obtido concatenando seus argumentos de ponta a ponta.

Um número que ocorre por si mesmo em uma expressão é tomado como um vetor de comprimento um.

Observe que o operador de atribuição ('<- a="" alternativa.="" aponta="" caracteres="" como="" consiste="" contextos="" da="" dois="" dos="" e="" ele="" estritamente="" express="" lado="" maioria="" menor="" menos="" na="" nos="" o.="" o="" objeto="" ocorrem="" operador="" p="" para="" pode="" que="" recebendo="" ser="" uma="" usado="" valor="">

A atribuição também pode ser feita usando a função attrib (). Uma maneira equivalente de fazer a mesma tarefa como a acima é com:

> attrib ("x", c (10.4, 5.6, 3.1, 6.4, 21.7))

O operador usual, <- atalho="" como="" isso.="" p="" para="" pensado="" pode="" ser="" sint="" tico="" um="">

As atribuições também podem ser feitas na outra direção, usando a mudança óbvia no operador de atribuição. Então, a mesma tarefa poderia ser feita usando

> c (10,4, 5,6, 3,1, 6,4, 21,7) -> x

Se uma expressão for usada como um comando completo, o valor será impresso e perdido. Então, agora, se usássemos o comando

> 1 / x

os respectivos cinco valores seriam impressos no terminal (e o valor de x, é claro, estaria inalterado).

A atribuição adicional

> y <- 0="" c="" p="" x="">

criaria um vetor y com 11 entradas consistindo de duas cópias de x com um zero no meio.

Aritmética do vetor


Os vetores podem ser usados ​​em expressões aritméticas, caso em que as operações são executadas elemento por elemento. Os vetores que ocorrem na mesma expressão não precisam ser todos do mesmo comprimento. Se não forem, o valor da expressão é um vetor com o mesmo comprimento que o vetor mais longo que ocorre na expressão. Os vetores mais curtos na expressão são reciclados com a frequência necessária (talvez fracionalmente) até que correspondam ao comprimento do vetor mais longo. Em particular, uma constante é simplesmente repetida. Então, com as atribuições acima, o comando

> v <- 1="" 2="" p="" x="" y="">

gera um novo vetor v de comprimento 11 construído pela adição, elemento por elemento, 2*x repetidos 2,2 vezes, e repetidos apenas uma vez e 1 repetido 11 vezes.

Os operadores aritméticos elementares são os mais comuns +, -, *, / e ^ para aumentar a potência. Além disso, todas as funções aritméticas comuns estão disponíveis. log, exp, sin, cos, tan, sqrt, e assim por diante, todas têm seu significado usual. max e min selecionam os maiores e menores elementos de um vetor, respectivamente. O intervalo é uma função cujo valor é um vetor de comprimento dois, ou seja, c (min (x), max (x)). O length (x) é o número de elementos em x, sum (x) dá o total dos elementos em x e prod (x) o produto.

Duas funções estatísticas são mean (x) que calcula a média da amostra, que é o mesmo que  sum (x) / length (x) e var (x) que dá

sum((x-mean (x))^2)/(length(x) -1)

ou a variância da amostra. Se o argumento para var () for uma matriz n-por-p, o valor é uma matriz de covariância de amostra p-por-p obtida em relação às linhas como vetores de amostra independentes p-variável.

order (x) retorna um vetor do mesmo tamanho que x com os elementos dispostos em ordem crescente; no entanto, existem outras facilidades de classificação mais flexíveis disponíveis (veja order() ou sort.list () que produzem uma permutação para fazer a classificação).

Observe que max e min selecionam os maiores e menores valores em seus argumentos, mesmo que sejam dados vários vetores. As funções máxima e mínima paralelas pmax e pmin retornam um vetor (de comprimento igual ao seu argumento mais longo) que contém em cada elemento o maior (menor) elemento dessa posição em qualquer um dos vetores de entrada.

Para a maioria dos propósitos, o usuário não se preocupará se os "números" em um vetor numérico forem inteiros, reais ou até mesmo complexos. Os cálculos internos são feitos como números reais de dupla precisão ou números complexos de dupla precisão se os dados de entrada forem complexos.

Para trabalhar com números complexos, forneça uma parte complexa explícita. portanto

sqrt (-17)

dará a NaN e um aviso, mas

sqrt (-17 + 0i)

irá fazer os cálculos com números complexos.

Gerando sequências regulares


R possui várias facilidades para gerar seqüências de números comumente usadas. Por exemplo, 1:30 é o vetor c (1, 2, ..., 29, 30). O operador de dois pontos tem alta prioridade dentro de uma expressão, então, por exemplo, 2 * 1: 15 é o vetor c (2, 4, ..., 28, 30). Coloque n <- 10="" 1:="" as="" compare="" e="" n-1="" ncias="" p="" sequ="">

A construção 30: 1 pode ser usada para gerar uma seqüência que vai para trás.

A função seq () é uma facilidade mais geral para gerar seqüências. Tem cinco argumentos, apenas alguns dos quais podem ser especificados em qualquer chamada. Os dois primeiros argumentos, se dados, especificam o início e o fim da seqüência, e se estes são os dois únicos argumentos dados, o resultado é o mesmo que o operador do ponto. Isso é seq (2,10) é o mesmo vetor que 2:10.

Argumentos para seq (), e para muitas outras funções R, também podem ser dadas sob a forma nomeada, caso em que a ordem em que aparecem é irrelevante. Os dois primeiros argumentos podem ser nomeados de = valor e para = valor; assim seq (1,30), seq (de = 1, para = 30) e seq (para = 30, de = 1) são todos iguais às 1:30. Os próximos dois argumentos para seq () podem ser nomeados por = valor e comprimento = valor, que especificam um tamanho de incremento e um tamanho para a seqüência, respectivamente. Se nenhum destes for dado, o padrão por = 1 é assumido.

Por exemplo

> seq (-5, 5, by = .2) -> s3

gera em s3 o vetor c (-5,0, -4,8, -4,6, ..., 4,6, 4,8, 5,0).
Similarmente

> s4 <- by=".2)</p" from="-5," length="51," seq="">

gera o mesmo vetor em s4.

O quinto argumento pode ser chamado de along = vetor, que normalmente é usado como o único argumento para criar a seqüência 1, 2, ..., o comprimento (vetor) ou a seqüência vazia se o vetor estiver vazio (como pode acontecer).

Uma função relacionada é rep () que pode ser usada para replicar um objeto de várias maneiras complicadas. A forma mais simples é

> s5 <- rep="" times="5)</p" x="">

que colocará cinco cópias de x de ponta a ponta na s5. Outra versão útil é

> s6 <- cada="5)</p" rep="" x="">

que repete cada elemento de x cinco vezes antes de passar para o próximo.

Vetores lógicos


Além dos vetores numéricos, R permite a manipulação de quantidades lógicas. Os elementos de um vetor lógico podem ter os valores TRUE, FALSE e NA (para "não disponível", veja abaixo). Os dois primeiros são frequentemente abreviados como T e F, respectivamente. Note no entanto que T e F são apenas variáveis ​​que são definidas para TRUE e FALSE por padrão, mas não são palavras reservadas e, portanto, podem ser substituídas pelo usuário. Portanto, você sempre deve usar TRUE e FALSE.

Os vetores lógicos são gerados por condições. Por exemplo

> temp <- x=""> 13

define temp como um vetor do mesmo comprimento que x com valores FALSOS correspondentes a elementos de x onde a condição não é atendida e onde o VERDADEIRO está.

Os operadores lógicos são <, <=,>,> =, == para igualdade exata e ! = Para desigualdade. Além disso, se c1 e c2 são expressões lógicas, então c1 e c2 são suas interseções ("e"), c1 | c2 é a união deles ("ou"), e ! c1 é a negação de c1.

Os vetores lógicos podem ser usados ​​na aritmética comum, caso em que são coagidos em vetores numéricos, FALSOS tornando-se 0 e VERDADEIROS tornando-se 1. No entanto, existem situações em que vetores lógicos e suas contrapartes numéricas coercivas não são equivalentes, por exemplo, veja a próxima subseção.

Valores perdidos


Em alguns casos, os componentes de um vetor podem não ser completamente conhecidos. Quando um elemento ou valor está "não disponível" ou há um "valor perdido" no sentido estatístico, um lugar dentro de um vetor pode ser reservado para ele, atribuindo-lhe o valor especial NA. Em geral, qualquer operação em NA torna-se NA. A motivação para esta regra é simplesmente o fato de que se a especificação de uma operação estiver incompleta, o resultado não pode ser conhecido e, portanto, não está disponível.

A função is.na (x) dá um vetor lógico do mesmo tamanho que x com o valor VERDADEIRO se e somente se o elemento correspondente em x for NA.

> z <- 3="" c="" ind="" is.na="" na="" p="" z="">

Observe que a expressão lógica x == NA é bastante diferente de is.na (x), pois NA não é realmente um valor, mas um marcador para uma quantidade que não está disponível. Assim, x == NA é um vetor do mesmo comprimento que x, todos cujos valores são NA, pois a própria expressão lógica está incompleta e, portanto, indecidível.

Nota-se que há um segundo tipo de valores "perdidos" que são produzidos por computação numérica, os chamados valores Não um Número, NaN. Exemplos são

> 0/0

ou

> Inf - Inf

que ambos resultam em NaN uma vez que o resultado não pode ser definido com sensibilidade.

Em resumo, is.na (xx) é VERDADEIRO tanto para valores NA quanto para NaN. Para diferenciar estes, is.nan (xx) é apenas VERDDEIRO para NaNs.

Os valores que faltam são às vezes impressos como quando os vetores de caracteres são impressos sem aspas.

Vetores de caracteres


As quantidades de caracteres e os vetores de caracteres são usados ​​com freqüência em R, por exemplo, como rótulos de plotagem. Quando necessário, eles são denotados por uma seqüência de caracteres delimitada pelo caractere de cotação dupla, por exemplo, "valores-x", "Novos resultados de iteração".

As cadeias de caracteres são inseridas usando as citações duplas (") ou um simples ('), mas são impressas usando aspas duplas (ou às vezes sem aspas). Elas usam as seqüências de escape do estilo C, usando \ como o caractere de escape, então \\ é inserido e impresso como \\ e dentro de aspas duplas "é inserido como \". Outras seqüências de escape úteis são \n, newline, \t, tab e \b, backspace. Cotações para uma lista completa.

Os vetores de caracteres podem ser concatenados em um vetor pela função c (); Exemplos de seu uso emergirão com freqüência.

A função paste() assume uma quantidade arbitrária de argumentos e concatena-os um a um em strings de caracteres. Qualquer número dado entre os argumentos é coagido em strings de caracteres da maneira evidente, ou seja, da mesma forma que seria se fossem impressas. Os argumentos são, por padrão, separados no resultado por um único caractere em branco, mas isso pode ser alterado pelo argumento nomeado, sep = string, que o muda para uma string, possivelmente vazia.

Por exemplo

> labs <- 1:10="" c="" p="" paste="" sep="">

cria labs nos vetores dos caracteres

c ("X1", "Y2", "X3", "Y4", "X5", "Y6", "X7", "Y8", "X9", "Y10").

Nota-se particularmente que a reciclagem de listas curtas também ocorre aqui; assim c("X","Y") é repetido 5 vezes para coincidir com a sequência 1:10. 9


Vetores de índice; selecionando e modificando subconjuntos de um conjunto de dados


Os subconjuntos dos elementos de um vetor podem ser selecionados anexando ao nome do vetor um vetor de índice entre colchetes. Geralmente, qualquer expressão que se avalia em um vetor pode ter subconjuntos de seus elementos selecionados de forma semelhante ao adicionar um vetor de índice entre colchetes imediatamente após a expressão.

Esses vetores de índice podem ser um desses quatro tipos distintos.

  1. Um vetor lógico. Nesse caso, o vetor do índice é reciclado no mesmo comprimento que o vetor a partir do qual os elementos devem ser selecionados. Os valores correspondentes a VERDADEIROS no vetor de índice são selecionados e aqueles que correspondem a FALSOS são omitidos. Por exemplo

> y <- is.na="" p="" x="">
cria (ou recria) um objeto y que conterá os valores não faltantes de x na mesma ordem. Observe que se x tiver valores faltantes, y será menor do que x. Além disso

> (x + 1) [(! is.na (x)) & x> 0] -> z

cria um objeto z e coloca nele os valores do vetor x + 1 para o qual o valor correspondente em x não era faltante e positivo.

2. Um vetor de quantidades integrais positivas. Nesse caso, os valores no vetor do índice devem estar no conjunto {1, 2, ..., comprimento (x)}. Os elementos correspondentes do vetor são selecionados e concatenados, nessa ordem, no resultado. O vetor de índice pode ser de qualquer comprimento e o resultado é do mesmo comprimento que o vetor do índice. Por exemplo x [6] é o sexto componente de x e

> x [1:10]

seleciona os primeiros 10 elementos de x (supondo que o comprimento (x) não seja inferior a 10). Além disso

> c ("x", "y") [rep (c (1,2,2,1), vezes = 4)]

(uma coisa certamente improvável de se fazer) produz um vetor de caracteres de comprimento 16 que consiste em "x", "y", "y", "x" repetido quatro vezes.

3. Um vetor de quantidades integrais negativas. Esse vetor de índice especifica os valores a serem excluídos e não incluídos. portanto

> y <- 5="" p="" x="">

dá todos, exceto os cinco primeiros elementos do x.

4. Um vetor de cordas de caracteres. Esta possibilidade aplica-se apenas quando um objeto tem um atributo de nomes para identificar seus componentes. Neste caso, um sub-vetor do vetor de nomes pode ser usado da mesma maneira que os rótulos integrados positivos no item 2 acima.

> fruta <- 10="" 1="" 20="" c="" p="">
> nomes (frutas) <- banana="" c="" laranja="" ma="" p="" ssego="">
> almoço <- c="" fruta="" laranja="" ma="" p="">

A vantagem é que os nomes alfanuméricos são geralmente mais fáceis de lembrar do que os índices numéricos. Esta opção é particularmente útil em relação aos quadros de dados, como veremos mais adiante.

Uma expressão indexada também pode aparecer na extremidade receptora de uma tarefa, caso em que a operação de atribuição é executada apenas nos elementos do vetor. A expressão deve ser do vetor de form [index_vector] como tendo uma expressão arbitrária no lugar do nome do vetor, não faz muito sentido aqui.

Por exemplo

> x [is.na (x)] <- 0="" p="">

substitui quaisquer valores faltantes em x por zeros e

> y [y <0 -y="" p="" y="">

tem o mesmo efeito que

> y <- abs="" p="" y="">


Outros tipos de objetos


Os vetores são o tipo de objeto mais importante em R, mas há vários outros que encontraremos mais formalmente em breve.

  • matrizes ou também chamadas de arrays são generalizações multidimensionais de vetores. Na verdade, elas são vetores que podem ser indexados por dois ou mais índices e serão impressos de maneiras especiais.

  • Os fatores fornecem maneiras compactas de lidar com dados categóricos.

  • as listas são uma forma geral de vetor em que os vários elementos não precisam ser do mesmo tipo, e são muitas vezes eles próprios vetores ou listas. As listas fornecem uma maneira conveniente de retornar os resultados de uma computação estatística.

  • Os data frames são estruturas tipo matriz, nas quais as colunas podem ser de diferentes tipos. Pense neles como "matrizes de dados" com uma linha por unidade de observação, mas com (possivelmente) variáveis ​​numéricas e categóricas. Muitas experiências são descritas melhor por data frames: os tratamentos são categóricos, mas a resposta é numérica.

  • As funções são objetos próprios em R que podem ser armazenadas no espaço de trabalho do projeto. Isso fornece uma maneira simples e conveniente de estender o R.

Conclusão


Esse tal de R é poderoso não é mesmo?

Christian Guerreiro

Professor por vocação, blogueiro e servidor público por opção, amante da tecnologia e viciado em informação.


Ensino a distância em Bitcoin & Criptomoedas, além de Tecnologia da Informação: Virtualização com VMware, Big Data com Hadoop, Certificação ITIL 2011 Foundations e muito mais.


Suporte o Tecnologia que Interessa!

Você acha que as informações compartilhadas aqui são úteis?
Então me ajude a produzir ainda mais e melhores conteúdos!


É muito fácil. Basta divulgar nossos treinamentos pra alguém que conheça!


E se for de Salvador, podemos estruturar um curso presencial para sua empresa!

Eu vou ficar muito grato (e quem fizer os curso também :)!