我想将自定义函数应用于3d数组的每一行,不包括存储在vector nul中的特定值。对于数组的第i行(任一层),我想从评估中排除该行中与矢量nul中的第i个值匹配的所有值。
mat <- rep(cbind(c(1,3,0,1,4),c(0,4,1,2,1), c(2,3,0,4,0), c(1,0,4,2,0), c(0,2,3,0,1)),2)
arr <- array(mat, dim=c(5,5,2))
nul <- c(1,3,5,8,4)
我尝试了很多不同的东西,但我最接近的是:
x1 <- apply(arr,c(1,3), function(x)myfun(x[x!=(nul)]))
但是,这会导致在arr中排除行元素,这些行元素与nul中每行中的相应行元素匹配。
为了简单起见,“myfun”是一个总结,但实际上这会更复杂:> nul
[1] 1 3 5 8 4
> arr
, , 1
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 2 1 0
[2,] 3 4 3 0 2
[3,] 0 1 0 4 3
[4,] 1 2 4 2 0
[5,] 4 1 0 0 1
, , 2
[,1] [,2] [,3] [,4] [,5]
[1,] 1 0 2 1 0
[2,] 3 4 3 0 2
[3,] 0 1 0 4 3
[4,] 1 2 4 2 0
[5,] 4 1 0 0 1
> x1
[,1] [,2]
[1,] 3 3
[2,] 12 12
[3,] 8 8
[4,] 8 8
[5,] 6 6
如您所见,仅排除位置[1,1,1]处的“1”,而不是该行中的每个匹配值。此外,该函数在每行中排除“1”,而不是仅排在第一行。
所需的输出是:
[1,] 2 2
[2,] 6 6
[3,] 8 8
[4,] 8 8
[5,] 2 2
答案 0 :(得分:1)
尝试使用代替函数
res <- cbind(rep(0,5), rep(0,5)) #is the result matrix
count <- 1 #is the dimension count of the array
while (count <= dim(arr)[3]){
for (i in 1:nrow(arr[,,count])){
res[i,count] <- sum(arr[i,c(which(arr[i,,count] != nul[i])), count])
}
count <- count + 1
}
但是我不明白最终的输出部分。