У меня есть следующий фрейм данных и вектор.
> y
v1 v2 v3
1 1 6 43
2 4 7 5
3 0 2 32
> v
[1] 1 2 3
Я хочу применить следующую функцию к каждой ROW в этом фрейме данных, так что v добавляется к каждой ROW y:
x <- function(vector1,vector2) {
x <- vector1 + vector2
}
... чтобы получить ЭТИ результаты:
v1 v2 v3
1 2 8 46
2 5 9 8
3 1 4 35
mapply применяет функцию к COLUMNS :
> z <- mapply(x, y, MoreArgs=list(vector2=v))
> z
v1 v2 v3
[1,] 2 7 44
[2,] 6 9 7
[3,] 3 5 35
Я пробовал транспонировать фрейм данных, чтобы функция применялась к строкам, а не столбцам, но mapply дает мне странные результаты после транспонирование:
> transposed <- t(y)
> transposed
[,1] [,2] [,3]
v1 1 4 0
v2 6 7 2
v3 43 5 32
> z <- mapply(x, transposed, MoreArgs=list(vector2=v))
> z
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] 2 7 44 5 8 6 1 3 33
[2,] 3 8 45 6 9 7 2 4 34
[3,] 4 9 46 7 10 8 3 5 35
... Помощь?
########################### РЕДАКТИРОВАТЬ ######## #################
Спасибо за все ответы! Я изучаю массу новых функций R, которых никогда раньше не видел, и это фантастика.
Я хочу немного уточнить свой предыдущий вопрос. На самом деле я задаю гораздо более общий вопрос - как применить многопараметрическую функцию к каждой строке в R (на данный момент я склонен заключить, что я должен просто использовать цикл, но я хотел бы выяснить, возможно ли это, просто для справки в будущем ...) (Я также намеренно воздерживался от показа кода, с которым работаю, так как он немного беспорядочный).
Я пытался использовать функцию развертки, как было предложено, но получаю следующую ошибку:
testsweep <- function(vector, z, n) {
testsweep <- z
}
> n <- names(Na_exp)
> n
[1] "NaCl.10000.2hr.AVG_Signal" "NaCl.10000.4hr.AVG_Signal"
> t <- head(Li_fcs,n=1)
> t
LiCl.1000.1hr.FoldChange LiCl.2000.1hr.FoldChange LiCl.5000.1hr.FoldChange
[1,] -0.05371838 -0.1010928 -0.01939986
LiCl.10000.1hr.FoldChange LiCl.1000.2hr.FoldChange
[1,] 0.1275617 -0.107154
LiCl.2000.2hr.FoldChange LiCl.5000.2hr.FoldChange
[1,] -0.06760782 -0.09770226
LiCl.10000.2hr.FoldChange LiCl.1000.4hr.FoldChange
[1,] -0.1124188 -0.06140386
LiCl.2000.4hr.FoldChange LiCl.5000.4hr.FoldChange
[1,] -0.04323497 -0.04275953
LiCl.10000.4hr.FoldChange LiCl.1000.8hr.FoldChange
[1,] 0.03633496 0.01879461
LiCl.2000.8hr.FoldChange LiCl.5000.8hr.FoldChange
[1,] 0.257977 -0.06357423
LiCl.10000.8hr.FoldChange
[1,] 0.07214176
> z <- colnames(Li_fcs)
> z
[1] "LiCl.1000.1hr.FoldChange" "LiCl.2000.1hr.FoldChange"
[3] "LiCl.5000.1hr.FoldChange" "LiCl.10000.1hr.FoldChange"
[5] "LiCl.1000.2hr.FoldChange" "LiCl.2000.2hr.FoldChange"
[7] "LiCl.5000.2hr.FoldChange" "LiCl.10000.2hr.FoldChange"
[9] "LiCl.1000.4hr.FoldChange" "LiCl.2000.4hr.FoldChange"
[11] "LiCl.5000.4hr.FoldChange" "LiCl.10000.4hr.FoldChange"
[13] "LiCl.1000.8hr.FoldChange" "LiCl.2000.8hr.FoldChange"
[15] "LiCl.5000.8hr.FoldChange" "LiCl.10000.8hr.FoldChange"
Но когда я пытаюсь применить развертку ...
> test <- sweep(t, 2, z, n, FUN="testsweep")
Error in if (check.margin) { : argument is not interpretable as logical
In addition: Warning message:
In if (check.margin) { :
the condition has length > 1 and only the first element will be used
Когда я удаляю параметр n из этого тестового примера, развертка работает нормально . Это говорит мне о том, что развертка не может использоваться, если все параметры, предоставленные для развертки, не являются либо тем же числом столбцов, что и вектор t, либо длиной 1. Пожалуйста, поправьте меня, если я ошибаюсь ...