我有这个数组:
arr <- array(data = c(0.1, 0.52, 0.3, 0.4, 0.15, 0.2, 0.7, 0.8), dim = c(2, 2, 2))
> arr
, , 1
[,1] [,2]
[1,] 0.10 0.3
[2,] 0.52 0.4
, , 2
[,1] [,2]
[1,] 0.15 0.7
[2,] 0.20 0.8
我想测试arr [,, 1]和[,, 2]的对应值中是否存在大于0.5的值,因此如果不返回NA,请返回该值。 适用于0.10; 0.15(在这种情况下,返回NA,因为它们都不是> 0.5),然后转到0.3; 0.7(在元素> 0.5时,返回0.7,因为它们是开的),等等
我的愿望输出1矩阵2 * 2:
res1= #resturn the value
[,1] [,2]
[1,] NA 0.7
[2,] 0.52 0.8
和另一个矩阵2 * 2显示索引 res2 =返回该值的索引
[,1] [,2]
[1,] NA 1
[2,] 1 2
1表示0.7来自第一矩阵arr [,, 1]
2表示0.8来自第二矩阵arr [,, 2]等
答案 0 :(得分:0)
f <- function(x,a){
x[x < a] <- NA
x[!is.na(x)] <- 1
return(x)
}
arr <- array(data = c(0.1, 0.52, 0.3, 0.4, 0.3, 0.2, 0.7, 0.8), dim = c(2, 2, 2))
arr[1,,]
for(i in 1:dim(arr)[2]){
for(j in 1:dim(arr)[3]){
arr[,i,j] <- f(arr[,i,j],0.5)
}
}
arr[1,,]
我敢肯定有更有效的方法,但这行得通。
答案 1 :(得分:0)
编辑::这是一个过于hacky的解决方案:
df2<-as.data.frame(arr)
df3<-as.data.frame(apply(df2,2,function(x)ifelse(x>0.5,x,NA)))
mat<-as.matrix(df3[,purrr::map_lgl(df3,~sum(is.na(.x))<=1)])
row(mat)
结果:
> mat
V1 V4
[1,] NA 0.7
[2,] 0.52 0.8
> row(mat)
[,1] [,2]
[1,] 1 1
[2,] 2 2
原始:
我们可以使用plyr
:
plyr::aaply(arr,c(1,2),function(x) ifelse(x>0.5,x,NA))
结果:
, , = 1
X2
X1 1 2
1 NA NA
2 0.52 NA
, , = 2
X2
X1 1 2
1 NA 0.7
2 NA 0.8