2013-02-13 64 views
4

我试图重写一段我一直在使用的函数。简化它是这样的:由两个变量data.table(.SD)的子集

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的最长时间。 – 2013-02-13 14:52:06

+1

另外,如果你想获得行号而不是'Time'的最高值,你可以写'dat [,.I [which.max(Time)],by =“ID”]''。 – 2013-02-13 15:01:30

+1

也许'dat [,.SD [which.max(Time)],by =“ID,SUBID”]'。 – 2013-02-13 15:06:56

回答

2

问题不在功能中。这个功能实际上一直在做它的工作。问题在于输入。身份证号码有时会占用一个非常大的值,导致分机出于某种原因失败。将此数字转换为字符后。问题解决了,功能很好。