根据评论编辑: OP想要计算:
(100 * (1 - 10 ^ - (Do - Do[Do==0] )) ⎞ (1 - 10 ^ - (Do[Do==100] - Do[Do==0]) - Do
对于Cl
中In
,Sa
,data.frame
的每个组合
-RS
我正在尝试将一个名为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。
作为一种丑陋而昂贵的解决方案,我使用了独特的解决方案我需要一个更好的基本解决方案。
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中(粘贴(“^”,唯一(Do),“\。”,唯一(C1),“\。”,唯一(In),:参数'pattern'的长度> 1且仅有将使用第一个元素
然后我尝试了mapply
mapply(dG, Do, Cl, In, Sa, SIMPLIFY = FALSE)
mapply使用我的数据正确评估了该函数。 mapply生成6144个列表。您会注意到mapply输出基本上是384个唯一列表,每个列表重复16次384 * 16 = 6144。
我的想法是:
更改第二个函数的参数,以便参数的长度为384.也许使用列表的名称作为输入参数。我不知道怎么做。
更改公式dG而不使用(Do,Cl,In,Sa)参数,因为每个参数的长度为6144
答案 0 :(得分:5)
您对@Roland所做的评论,只需要包含在previous related questions中的所有内容。
您可以在一行代码中处理整个过程:
library(data.table)
myDT <- data.table(DataFrame)
myDT[ , "TVI" := 100 * (1 - 10^-(Data - Data[Do==0])) / (1 - 10^-(Data[Do==100] - Data[Do==0]))
, by=list(Cl, In, Sa)]
# this is your Tonval Value Increase
myDT$TVI
原始答案:
目前还不清楚你想要完成什么。但是,这里有两个概念,应该可以为您节省一个令人头疼的世界。
ids
功能。您可以从expand.grid
获得更多里程:myIDs <- expand.grid(unique(Do), unique(Cl), unique(In), unique(Sa))
# You can then use something like
apply(myIDs, 1, paste, sep=".")
# to get the same results. Or whatever other function suits
然而,即使这不是必要的。
dG
的{{1}}函数的等效内容。请注意,不需要任何拆分或data.table
或类似的任何内容
所有内容都由ids
中的by
函数处理。
data.table