Como percorrer uma lista ou quadro de dados com R aplicar funções

Quando seus dados estão na forma de uma lista, e você quiser executar cálculos em cada elemento dessa lista em R, a adequada aplicar função é lapply (). Por exemplo, para obter a classe de cada elemento de íris, faça o seguinte:

> Lapply (íris, classe)

Como você sabe, quando você usa sapply (), R tenta simplificar os resultados para uma matriz ou vetor:

> Sapply (íris, classe) Sepal.Length Sepal.Width Petal.Length Petal.Width Espécies "numérico" "numérico" "numérico" "numérico" "fator"

Digamos que você queira calcular a média de cada coluna de íris:

> sapply (íris, dizer) Sepal.Length Sepal.Width Petal.Length Petal.Width Species5.843333 3,057333 3,758000 1,199333 mensagem NAWarning: Em mean.default (X [[5L]], ...): argumento não é numérico ou lógica: o retorno NA

Há um problema com esta linha de código. Ele lança uma mensagem de aviso porque espécies não é uma coluna numérica. Assim, você pode querer escrever uma pequena função dentro aplicar() que testa se o argumento é numérico. Se for, em seguida, calcular a média scorecard em contrário, simplesmente devolvê N / D.

o DIVERSÃO argumento do aplicar() funções pode ser qualquer função, incluindo suas próprias funções personalizadas. Na verdade, você pode ir um passo adiante. Na verdade, é possível definir uma função dentro a DIVERSÃO chamada de argumento para qualquer aplicar() função:

> Sapply (íris, função (x) ifelse (is.numeric (x), média (x), NA)) Sepal.Length Sepal.Width Petal.Length Petal.Width Species5.843333 3,057333 3,758000 1,199333 NA

O que está acontecendo aqui? Você definiu uma função que leva um único argumento x. E se x é numérico, ele retorna média (x)- caso contrário, retorna N / D. Porque sapply () atravessa sua lista, cada coluna, por sua vez, é passado para a função e avaliados.

Quando você definir uma função sem nome como este dentro de outra função, ele é chamado de função anônima. funções anônimas são úteis quando você deseja calcular algo bastante simples, mas você não necessariamente quer armazenar permanentemente essa função em seu espaço de trabalho.

menu