【问题标题】:Subset of data.table (.SD) by two variables由两个变量组成的 data.table (.SD) 子集
【发布时间】:2013-02-13 14:41:56
【问题描述】:

我正在尝试重写一个我已经使用了一段时间的函数。简化为:

dat = data.table(dataframe) 

getRecentRow <- function(data) {
    #Get most recent row (with highest time)
    row = data[order(-Time)][1]
    return(row)     
    }

# Run getRecentRow on each chunk given an ID
output = dat[,getRecentRow(.SD), by=ID]

此功能为我提供每个 ID 的最新条目(因此具有最高的时间)。但是,对于每个 ID,可以有多个条目。这些条目可以用 SUBID 来区分。我想更深入地挖掘一个级别,而不是获取每个 ID 的最新条目,我想要每个 SUBID 的最新条目。由于 SUBID 不是唯一的,因此还必须考虑 ID。因此,我想要每个 ID、每个 SUBID 的最新条目。

总结:getRecentRow() 函数的输入不应按 ID 进行子集,而应按 ID 和 SUBID。

我试过了:

dat = data.table(dataframe) 

    getRecentRow <- function(data) {
    #Get most recent row (with highest time)
    row = data[order(-Time)][1]
    return(row)     
    }

# Run getRecentRow on each chunk given an ID
output = dat[,getRecentRow(.SD), by=list(ID, SUBID)]

但这会返回不正确的输出,输出更多所需的行。我认为重新编写by=list(ID, SUBID) 应该是一个简单的解决方法,但我不知道怎么做。

【问题讨论】:

  • 为什么output = dat[,max(Time), by=ID] 在您的情况下不起作用?这也应该为您提供每个 ID 的最高时间。
  • 另外,如果你想获得Time的最高值的行号,你可以写dat[, .I[which.max(Time)], by="ID"]
  • 也许dat[,.SD[which.max(Time)],by="ID,SUBID"]
  • 我们需要一些示例数据来说明问题。
  • 请构建一个答案并将此问题从其孤立状态中拯救出来。

标签: r data.table


【解决方案1】:

问题不在函数中。该功能实际上一直在做它的工作。问题在于输入。 ID 号有时会取一个非常大的值,导致由于某种原因拆分失败。将此数字转换为字符后。问题解决了,功能也很好。

【讨论】:

    猜你喜欢
    • 2018-11-24
    • 1970-01-01
    • 2018-07-08
    • 1970-01-01
    • 2017-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-07
    相关资源
    最近更新 更多