R:动态地将参数传递给pmin或pmax - 代码不起作用

时间:2015-01-28 22:07:00

标签: r

下面的代码提取工作正常,其中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))

我尝试过的任何事都没有奏效。任何帮助非常感谢。

3 个答案:

答案 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]])