【问题标题】:Problem with data.table ifelse behaviordata.table ifelse 行为有问题
【发布时间】:2011-08-31 18:35:11
【问题描述】:

我正在尝试使用 data.table 计算一个简单的比率。不同的文件有不同的 tmax 值,所以我需要ifelse。当我调试它时,dt 看起来不错。 tmaxValue 是单个值(在这种情况下遇到的第一个“t=60”),但t0Value 是 dt 中的所有“t=0”值。

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])
}

我得到的是tmaxValueResult 除以所有Result 的所有t0Value,但我想要的是每个唯一@987654329 的单一比率@。

感谢您的帮助。

【问题讨论】:

  • ...您能澄清一下您的数据是什么吗?好像是data.table,因为你使用Ratio:=tmaxValue/t0Value]?一个小的可重现的例子会很好。
  • +1 对于 Tommy 对可重复数据的请求。此外,请进行编辑以简化每个dt[which(dt[,Time] == "t=240min"),Result]dt[Time=="t=240min",Result]。即便如此,我们也不喜欢 i 中的 ==(参见关于矢量扫描的介绍小插曲),但至少我们正在取得进展……

标签: r if-statement data.table


【解决方案1】:

您没有提供可重现的示例,但通常使用 ifelse 是错误的做法。

尝试改用if(...) ... else ...

ifelse(test, yes, no) 的行为很奇怪:它产生一个带有来自test属性length 以及来自yesno 的值的结果。 ...所以在您的情况下,您应该得到没有属性且长度为 1 的东西 - 这可能不是您想要的,对吧?

[UPDATE] ...嗯,或者可能是因为您说tmaxValue 是一个单一的值... 那么问题不在于计算tmaxValue?请注意,ifelse 仍然是错误的工作工具...

【讨论】:

    猜你喜欢
    • 2017-10-01
    • 2019-12-11
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 2020-04-20
    相关资源
    最近更新 更多