用mapply()留出多个参数吗?

时间:2019-02-22 14:15:47

标签: r

我可以用一个向量A = c(1,2,3,4,5)来写

 sapply(A, function(a) mean(A[-a]))

计算5个均值:不含第一个元素的A的平均值,不含第二个元素的A的平均值,等等。

我想同时对两个或多个向量进行这样的留一法操作。例如,使用B <- c(6,7,8,9,10),我认为我可以输入

myFunc <- function(a, b){return( c(mean(A[-a]), mean(B[-b])) )}
mapply(myFunc, A, B)

但这仅计算A的留一法平均值:

     [,1] [,2] [,3] [,4] [,5]
[1,]  3.5 3.25    3 2.75  2.5
[2,]  8.0 8.00    8 8.00  8.0

并为B输出8.0s的一行。我在做什么错了?

3 个答案:

答案 0 :(得分:1)

在第一个向量“ A”中,值与序列相同。因此,当我们使用该值编制索引并删除时,它将删除相应的值。在第二个向量“ B”中,情况并非如此,即B[-6]B[-7]仍然给出了整个向量。而是循环遍历

mapply(myFunc, seq_along(A), seq_along(B))

答案 1 :(得分:1)

您可以使用:

mapply(function(k) c(mean(A[-k]), mean(B[-k])), 1:length(A))

答案 2 :(得分:1)

首先,您可以向量化代码:(sum(x) - x) / (length(x) - 1),而不必在计算均值时遍历向量元素。此外,因为您有“两个个或更多向量”,所以最好将它们存储在列表中。然后,您可以使用lapply遍历向量。

lapply返回一个列表。但是,如果向量的长度不同,则无论如何都需要使用SIMPLIFY = FALSE中的mapply返回列表。

l <- list(A, B)
f <- function(x) (sum(x) - x) / (length(x) - 1)
lapply(l, f)
# [[1]]
# [1] 3.50 3.25 3.00 2.75 2.50
#
# [[2]]
# [1] 8.50 8.25 8.00 7.75 7.50