按两个变量筛选数据表的子集 (.SD)

4

我正在尝试重写一段我使用了一段时间的函数。简化后的代码如下:

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)就可以解决问题,但我找不到方法。

2
为什么在你的情况下 output = dat[,max(Time), by=ID] 不起作用?这也应该为每个ID提供最高时间。 - Christoph_J
1
另外,如果您想获取Time最高值对应的行号,而非值本身,可以编写dat[, .I[which.max(Time)], by="ID"] - Christoph_J
1
也许可以使用 dat[,.SD[which.max(Time)],by="ID,SUBID"] - Matt Dowle
3
请提供一些示例数据,以说明问题。 - Matt Dowle
1
请构建一个答案并拯救这个问题,使其不再孤立。 - IRTFM
显示剩余3条评论
1个回答

2

问题不在函数中,实际上函数一直在正常工作。问题出在输入上。ID号码有时会取到非常大的值,导致拆分失败。将这个数字转换为字符后,问题得以解决,函数表现良好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接