Как мне применить многопараметрическую функцию в R?

У меня есть следующий фрейм данных и вектор.

> 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. Пожалуйста, поправьте меня, если я ошибаюсь ...

6
задан Christina W 23 November 2011 в 20:25
поделиться