Quando eu olho para a origem dos Pacotes R, vejo a função sweep
usada com bastante frequência. Às vezes, é usado quando uma função mais simples seria suficiente (por exemplo, apply
), outras vezes, é impossível saber exatamente o que está fazendo sem gastar um bom tempo para percorrer o bloco de código em que está.
O fato de eu poder reproduzir sweep
o efeito de usando uma função mais simples sugere que não entendo sweep
os principais casos de uso de, e o fato de que essa função é usada com tanta frequência sugere que é bastante útil.
O contexto:
sweep
é uma função na biblioteca padrão de R; seus argumentos são:
sweep(x, MARGIN, STATS, FUN="-", check.margin=T, ...)
# x is the data
# STATS refers to the summary statistics which you wish to 'sweep out'
# FUN is the function used to carry out the sweep, "-" is the default
Como você pode ver, os argumentos são semelhantes a apply
embora sweep
requer mais um parâmetro STATS
,.
Outra diferença importante é que sweep
retorna um array da mesma forma que o array de entrada, enquanto o resultado retornado por apply
depende da função passada.
sweep
em ação:
# e.g., use 'sweep' to express a given matrix in terms of distance from
# the respective column mean
# create some data:
M = matrix( 1:12, ncol=3)
# calculate column-wise mean for M
dx = colMeans(M)
# now 'sweep' that summary statistic from M
sweep(M, 2, dx, FUN="-")
[,1] [,2] [,3]
[1,] -1.5 -1.5 -1.5
[2,] -0.5 -0.5 -0.5
[3,] 0.5 0.5 0.5
[4,] 1.5 1.5 1.5
Resumindo, o que estou procurando é um ou dois casos de uso exemplares sweep
.
Por favor, não recite ou crie links para a Documentação R, listas de discussão ou qualquer uma das fontes 'primárias' de R - suponha que eu as li. Estou interessado em como programadores / analistas experientes em R usam sweep
em seu próprio código.
fonte
apply
que posso descobrir para este resultado é algo comot(apply(t(M), 2, "-", dx))
, mas isso é muito desagradável.Respostas:
sweep()
é normalmente usado quando você opera uma matriz por linha ou coluna, e a outra entrada da operação é um valor diferente para cada linha / coluna. Se você opera por linha ou coluna é definido por MARGIN, assim como porapply()
. Os valores usados para o que chamei de "a outra entrada" são definidos por STATS. Assim, para cada linha (ou coluna), você pegará um valor de STATS e usará na operação definida por FUN.Por exemplo, se você quiser adicionar 1 à 1ª linha, 2 à 2ª, etc. da matriz que definiu, você fará:
Francamente, também não entendi a definição na documentação do R, apenas aprendi procurando exemplos.
fonte
STATS
parece ser um rótulo ruim para essa variável. É uma entradaFUN
que é usada para modificar o valor de cada elemento da matriz (M
neste exemplo).STATS
pode ser uma constante ou uma lista / vetor / etc de um tamanho correspondente ao tamanho do escolhidoMARGIN
. Eu acho que.sweep () pode ser ótimo para manipular sistematicamente uma grande matriz coluna por coluna ou linha por linha, conforme mostrado abaixo:
Concedido, este exemplo é simples, mas alterando o argumento STATS e FUN, outras manipulações são possíveis.
fonte
Esta questão é um pouco antiga, mas como recentemente enfrentei esse problema, um uso típico de varredura pode ser encontrado no código-fonte da função de estatísticas
cov.wt
, usada para calcular matrizes de covariância ponderada. Estou olhando o código em R 3.0.1. Aquisweep
é usado para subtrair as médias das colunas antes de calcular a covariância. Na linha 19 do código, o vetor de centralização é derivado:e na linha 54 é varrido para fora da matriz
O autor do código está usando o valor padrão
FUN = "-"
, o que me confundiu por um tempo.fonte
Um uso é quando você está computando somas ponderadas para um array. Onde
rowSums
oucolSums
pode ser assumido como significando 'pesos = 1',sweep
pode ser usado antes disso para fornecer um resultado ponderado. Isso é particularmente útil para arrays com> = 3 dimensões.Isso surge, por exemplo, ao calcular uma matriz de covariância ponderada conforme o exemplo de @James King.
Aqui está outro baseado em um projeto atual:
fonte
Você pode usar a
sweep
função para dimensionar e centralizar dados como o código a seguir. Observe quemeans
esds
são arbitrários aqui (você pode ter alguns valores de referência que deseja padronizar os dados com base neles):Este código converte pontuações brutas em pontuações T (com média = 50 e dp = 10):
fonte