2011-08-31 69 views
-1

我试图计算使用data.table一个简单的比例。不同的文件有不同的tmax值,所以我需要ifelse。当我调试时,dt看起来不错。所述tmaxValue是一个单一的值(第一“T = 60”,在这种情况下遇到的),但t0Value是所有的“t = 0时”值的DT。问题与data.table ifelse行为

summaryDT <- calculate_Ratio(reviewDT[,list(Result, Time), by=key(reviewDT)]) 

calculate_Ratio <- function(dt){ 
tmaxValue <- ifelse(grepl("hhep", inFile, ignore.case = TRUE), 
    dt[which(dt[,Time] == "t=240min"),Result], 
    ifelse(grepl("hlm",inFile, ignore.case = TRUE), 
     dt[which(dt[,Time] == "t=60"),Result], 
     dt[which(dt[,Time] == "t=30"),Result])) 
t0Value <- dt[which(dt[,Time] == "t=0"),Result] 
return(dt[,Ratio:=tmaxValue/t0Value]) 
} 

我所走出的是ResulttmaxValue由所有Result的所有t0Value的的划分,但我要的是为每一个独特by一个比例。

感谢您的帮助。

+1

...你能澄清你的数据是什么?这似乎是'data.table',因为你使用'Ratio:= tmaxValue/t0Value]'?一个小的可重复的例子会很好。 – Tommy

+0

+1对于汤米对可重现数据的请求。另外,请编辑以简化每个'dt [which(dt [,Time] ==“t = 240min”),Result]'到'dt [Time =='t = 240min',Result]'。即使那样,我们也不喜欢'i'中的'=='(参见介绍小插曲关于_vector scanning_),但至少我们正在取得进展...... –

回答

1

您没有提供一个可重复的例子,但通常使用ifelse是错误的做法。

尝试使用if(...) ... else ...代替。

ifelse(test, yes, no)行为非常奇怪:它产生的结果与从属性test长度yesno的值。 ...所以在你的情况下,你应该得到没有属性和长度的东西 - 这可能不是你想要的,对吧?

[更新] ...嗯,或者,也许这是因为你说tmaxValue是一个单一的值... 那么问题不在于计算tmaxValue?需要注意的是ifelse仍然是错误的工作工具...