下面的代码提取工作正常,其中Array1是一个填充的3维数组:
LotsMaxs <- pmax.int(Array1[,1,],Array1[,2,],Array1[,3,],Array1[,4,])
在这个例子中,代表治疗的第二个维度(在上面的代码中从1到4)是我所知道的,因此很容易编程。我想写一个可以处理任何数量治疗的功能。因此,如果nTreatment = 2,则上述代码变为:
LotsMaxs <- pmax.int(Array1[,1,],Array1[,2,])
我已在
等命令中编程text=noquote(c(paste("Array1[,", 1:(nTreatment-1),",],", sep = ""),paste("Array1[,", nTreatment,",]", sep = "")))
和许多类似的变体,并试图将它们插入命令,如:
LotsMaxs <- pmax.int(text) # and:
LotsMaxs <- do.call(pmax.int,list(numeric=text))
我尝试过的任何事都没有奏效。任何帮助非常感谢。
答案 0 :(得分:3)
您可以将apply
用于此目的:
apply(Array1, 2, pmax.int)
apply
将函数(在您的情况下为pmax.int
)应用于数组的“MARGIN”。
您想将它应用于第二个“MARGIN”。见?apply
P.S .: 如果它不是你想要的 请提供可重现的示例。
答案 1 :(得分:2)
我已经找到了问题的答案。代码
nRow=2
nTreatment =3 # column dimension in Array
nDepth = 4 #third dimension in Array
Array1 <- array(1:24,dim=c(nRow,nTreatment,nDepth))
answ1 <- pmax.int(Array1[,1,],Array1[,2,],Array1[,3,]) # this is what I wanted to replicate
DF1 <-data.frame(matrix(aperm(Array1,c(2, 1, 3)),nrow=nRow*nDepth,ncol=nTreatment,byrow=TRUE))
answ2 <- do.call(pmax.int,DF1) # same as answ1
意识到pmax.int函数将使用数据帧的列作为do.call中的适当参数是我的救星。我意识到我可能已经能够使用eval(解析(调用但是eval非常慢。我写的函数可能在模拟中被调用了数千次,因此速度是优先考虑的。
答案 2 :(得分:0)
这是我对你所问的问题的答案。我使用pickem
来定义我想要“提供”到最大化函数的列。
dput(foo)
structure(c(19L, 3L, 17L, 20L, 2L, 7L, 13L, 16L, 4L, 12L, 11L,
10L, 18L, 6L, 9L, 24L, 1L, 22L, 8L, 14L, 5L, 21L, 23L, 25L, 15L
), .Dim = c(5L, 5L))
pickem<-c(1,3,4)
foo[,pickem]
[,1] [,2] [,3]
[1,] 19 11 24
[2,] 3 10 1
[3,] 17 18 22
[4,] 20 6 8
[5,] 2 9 14
findmax<- max.col(foo[,pickem])
[1] 3 2 3 1 3
# compare those row indices with found maxima:
pmax.int(foo[,1],foo[,3],foo[,4])
[1] 24 10 22 20 14
所以你看到的是max.col
的输出标识了包含每行最大值的列。使用那些索引,可能像
LotsMax <- sapply(1:nrow(foo),function(j) foo[j,findmax[j]])