我可以用一个向量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的一行。我在做什么错了?
答案 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