根据评论编辑: OP想要计算:
(100 * (1 - 10 ^ - (Do - Do[Do==0] )) ⎞ (1 - 10 ^ - (Do[Do==100] - Do[Do==0]) - Do
对于-RSCl
中, In
,Sa
的每个组合data.frame
我正在尝试将一个名为 dG 的函数应用于数据帧。由于函数的参数长度不同,回收产生了不可预测的结果。
为了纠正这个问题,我将数据框分成列表,并在使用名为“ids”的函数识别每个列表后尝试将 dG 函数(如下)应用于每个列表。
- 请随时提出不同的解决方案。仅供参考,我的具体要求从要点开始
请让我首先提供显示问题的综合数据:
Do <- rep(c(0,2,4,6,8,10,15,20,30,40,45,50,55,60,65,70,80,85,90,92,94,96,98,100), each=16,times=16)
Cl <- rep(c("K", "Y","M","C"), each= 384, times=4)
In <- rep(c("A", "S"), each=3072)
Sa <- rep(c(1,2), each=1536)
Data <- rnorm(6144)
DataFrame <- cbind.data.frame(Do,Cl,In,Sa,Data); head(DataFrame)
rm(Do,Cl,In,Sa,Data)
attach(DataFrame)
DFSplit <- split(DataFrame[ , "Data"], list(Do, Cl, In, Sa))
函数 'ids' 是一个辅助函数,用于识别列表名称
ids <- function(Do, Cl, In, Sa){
grep( paste( "^" , Do, "\\.",
Cl, "\\.",
In,
"\\.", Sa,sep=""),
names(DFSplit), value = TRUE)}
mapply(ids, Do, Cl, In, Sa, SIMPLIFY = FALSE)
上面的 mapply 产生了 6144 个列表。如果您查看 mapply 输出,您会注意到有 384 个唯一列表名称,但每个名称重复 16 次 384*16=6144。
- 如何更改 'ids' 函数,以便 mapply 不会重复相同的名称 16 次。
作为一个丑陋且成本高昂的解决方案,我使用了独特的;我需要一个更好的基本解决方案。
unique(mapply(ids, Do, Cl, In, Sa, SIMPLIFY = FALSE))
dG 函数是我想要对每个“DFSplit”列表进行操作的函数。它与之前的 ids 函数有相同的问题。它使用 ids 函数作为输入。
dG <- function(Do,Cl, In, Sa){
dg <- 100*
(1-10^-( DFSplit[[ids(Do, Cl, In, Sa)]] - DFSplit[[ids(0, Cl, In, Sa)]])) /
(1-10^-( DFSplit[[ids(100, Cl, In, Sa)]] - DFSplit[[ids(0, Cl, In, Sa)]])) - Do
dg}
我尝试按如下方式使用 dG,但这不是我想要的。
dG(Do,Cl, In, Sa)
它只评估了 dG 函数的最后一部分(-Do)加上这个警告
在 grep(paste("^", unique(Do), "\.", unique(Cl), "\.", unique(In), : 参数 'pattern' 的长度 > 1 并且只有第一个元素是用过的
- 你能建议修改 dG 函数吗
然后我尝试了mapply
mapply(dG, Do, Cl, In, Sa, SIMPLIFY = FALSE)
mapply 使用我的数据正确评估了函数。mapply 生成 6144 个列表。您会注意到,mapply 输出基本上是 384 个唯一列表,每个列表重复 16 次 384*16=6144。
- 如何修改 dG 函数以摆脱无用且耗时的重复?
我的想法是:
- 消除我的第一个函数“ids”中的重复,我不知道该怎么做。
更改第二个函数的参数,使参数的长度为 384。也许使用列表的名称作为输入参数。我不知道怎么做。
更改公式 dG 并且不使用 (Do, Cl, In, Sa) 参数,因为每个参数的长度为 6144