Когда я смотрю на исходный код пакетов R, я вижу, что функция sweep
используется довольно часто. Иногда он используется, когда было бы достаточно более простой функции (например, apply
), в других случаях невозможно точно знать, что он делает, не потратив достаточное количество времени на пошаговое выполнение блока кода, в котором оно находится.
Тот факт, что я могу воспроизвести sweep
эффект с помощью более простой функции, говорит о том, что я не понимаю sweep
основных вариантов использования, а тот факт, что эта функция используется так часто, предполагает, что она весьма полезна.
Контекст:
sweep
это функция в стандартной библиотеке R; его аргументы:
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
Как вы можете видеть, аргументы аналогичны , apply
хотя sweep
требует еще один параметр, STATS
.
Еще одно ключевое отличие состоит в том, что sweep
возвращает массив той же формы, что и входной массив, тогда как результат, возвращаемый apply
функцией, зависит от переданной функции.
sweep
в действии:
# 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
Итак, то, что я ищу, - это один или два примерных варианта использования sweep
.
Пожалуйста, не цитируйте и не ссылайтесь на документацию R, списки рассылки или любые «первичные» источники R - предположим, что я их читал. Что меня интересует, так это то, как опытные программисты / аналитики R используют sweep
свой собственный код.
источник
apply
которое я могу найти для этого результата, - это что-то вродеt(apply(t(M), 2, "-", dx))
, но это довольно неприятно.Ответы:
sweep()
обычно используется, когда вы работаете с матрицей по строкам или по столбцам, а другой вход операции - это разные значения для каждой строки / столбца. Независимо от того, работаете ли вы по строке или по столбцу, определяется MARGIN, как дляapply()
. Значения, используемые для того, что я назвал «другим входом», определяются STATS. Итак, для каждой строки (или столбца) вы берете значение из STATS и используете его в операции, определенной FUN.Например, если вы хотите добавить 1 к 1-й строке, 2 ко 2-й и т. Д. Определенной вами матрицы, вы сделаете:
Я, честно говоря, тоже не понимал определения в документации R, я просто узнал, просматривая примеры.
источник
STATS
кажется, плохой ярлык для этой переменной. Это вход,FUN
который используется для изменения значения каждого элемента в матрице (M
в этом примере).STATS
может быть либо константой, либо списком / вектором / и т.д. размера, соответствующего размеру выбранногоMARGIN
. Думаю.sweep () отлично подходит для систематического управления большой матрицей столбец за столбцом или строка за строкой, как показано ниже:
Конечно, этот пример простой, но изменяя аргумент STATS и FUN, возможны и другие манипуляции.
источник
Этот вопрос немного устарел, но, поскольку я недавно столкнулся с этой проблемой, типичное использование развертки можно найти в исходном коде функции статистики
cov.wt
, используемой для вычисления взвешенных ковариационных матриц. Я смотрю код в R 3.0.1. Здесьsweep
используется , чтобы вычесть из средств столбцов перед вычислением ковариации. В строке 19 кода выводится центрирующий вектор:а в строке 54 он выметается из матрицы
Автор кода использует значение по умолчанию
FUN = "-"
, которое меня на некоторое время смутило.источник
Одно из применений - это когда вы вычисляете взвешенные суммы для массива. Где
rowSums
илиcolSums
может означать «веса = 1»,sweep
может использоваться перед этим для получения взвешенного результата. Это особенно полезно для массивов с> = 3 измерениями.Это возникает, например, при вычислении взвешенной ковариационной матрицы в соответствии с примером @James King.
Вот еще один, основанный на текущем проекте:
источник
Вы можете использовать
sweep
функцию для масштабирования и центрирования данных, как в следующем коде. Обратите внимание, чтоmeans
иsds
здесь произвольны (у вас могут быть некоторые справочные значения, на основе которых вы хотите стандартизировать данные):Этот код преобразует исходные оценки в оценки T (со средним значением = 50 и sd = 10):
источник