gpt4 book ai didi

r - 如何在 R 中应用多参数函数?

转载 作者:行者123 更新时间:2023-12-04 09:45:40 25 4
gpt4 key购买 nike

我有以下数据框和向量。

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

> v
[1] 1 2 3

我想将以下函数应用于该数据框中的每个 ROW,以便将 v 添加到 y 的每个 ROW:
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,否则不能使用扫描。如果我弄错了,请纠正我...

最佳答案

您要求使用“+”函数在 y 行中“扫描” v:

 sweep(y, 1,  v, FUN="+")
v1 v2 v3
1 2 7 44
2 6 9 7
3 3 5 35

关于r - 如何在 R 中应用多参数函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8247156/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com