2014-09-02 18 views
0

如何使用最新(最新)類型爲每個唯一名稱返回1行?通過評估多列來獲取子集data.table

DataTable中有6行:

example <- data.table(c("Bob","May","Sue","Bob","Sue","Bob"), 
         c("A","A","A","A","B","B"), 
       as.Date(c("2010/01/01", "2010/01/01", "2010/01/01", 
        "2012/01/01", "2012/01/11", "2014/01/01"))) 
setnames(example,c("Name","Type","Date")) 
setkey(example,Name,Date) 

應返回5行:

# 1: Bob A 2012-01-01 
# 2: Bob B 2014-01-01 
# 3: May A 2010-01-01 
# 4: Sue A 2010-01-01 
# 5: Sue B 2012-01-11 

回答

3

既然你已經通過NameDate排序,你可以使用unique(這要求unique.data.table)功能列NameType,其中fromLast = TRUE

require(data.table) ## >= v1.9.3 
unique(example, by=c("Name", "Type"), fromLast=TRUE) 
# Name Type  Date 
# 1: Bob A 2012-01-01 
# 2: Bob B 2014-01-01 
# 3: May A 2010-01-01 
# 4: Sue A 2010-01-01 
# 5: Sue B 2012-01-11 

這將爲每個Name,Type組挑選最後一行。希望這可以幫助。

PS:正如@mso指出的,這需要1.9.3,因爲fromLast參數僅在1.9.3(可從github獲得)中實現。

+0

第一行是爲即將到來:1:鮑勃一2010-01-01 而不是:#1:鮑勃·á2012-01-01 。 – rnso 2014-09-02 16:44:21

+0

有人想我要寫我自己的功能!非常感謝。 – felixmc 2014-09-03 10:42:54

1

繼@Arun答案工作的版本:

unique(example[rev(order(Name,Date))], by=c("Name", "Type"), fromLast=TRUE)[order(Name,Date)] 
    Name Type  Date 
1: Bob A 2012-01-01 
2: Bob B 2014-01-01 
3: May A 2010-01-01 
4: Sue A 2010-01-01 
5: Sue B 2012-01-11 

unique(example[order(Name, Date, decreasing=T)], by=c("Name","Type"))[order(Name, Date)] 
    Name Type  Date 
1: Bob A 2012-01-01 
2: Bob B 2014-01-01 
3: May A 2010-01-01 
4: Sue A 2010-01-01 
5: Sue B 2012-01-11 
答案
+0

非常好 - 謝謝。 – felixmc 2014-09-03 10:41:54