如何在R中应用多参数功能?

Chr*_*a W 6 r apply

我有以下数据框和向量.

> y
  v1 v2 v3
1  1  6 43
2  4  7  5
3  0  2 32

> v
 [1] 1 2 3
Run Code Online (Sandbox Code Playgroud)

我想将以下函数应用于该数据帧中的每个ROW,以便将v添加到y的每个ROW:

x <- function(vector1,vector2) {
    x <- vector1 + vector2
}
Run Code Online (Sandbox Code Playgroud)

...为了获得这些结果:

  v1 v2 v3
1  2  8 46
2  5  9  8
3  1  4 35
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

我已经尝试转置数据框,以便该函数将应用于行而不是列,但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
Run Code Online (Sandbox Code Playgroud)

...救命?

############################编辑##################### ####

感谢所有的答案!我正在学习大量新的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"
Run Code Online (Sandbox Code Playgroud)

但是当我尝试应用扫描时......

> 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
Run Code Online (Sandbox Code Playgroud)

当我从这个测试示例中删除n参数时,扫描工作正常.这告诉我除非提供给扫描的所有参数与t向量的列数相同,或者长度为1,否则不能使用扫描.如果我错了,请纠正我...

Luc*_*zer 0

使用应用怎么样?

 t(apply(y, 1, function(x) x + v))
     [,1] [,2] [,3]
[1,]    2    8   46
[2,]    5    9    8
[3,]    1    4   35
Run Code Online (Sandbox Code Playgroud)

我不知道为什么 apply 将行返回为列,因此需要对其进行转置。