2014-09-02 5 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

Поскольку вы уже отсортированы по Name и Date, вы можете использовать unique (который вызывает unique.data.table) функцию колонны Name и Type, с 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

+0

Я думал, что мне придется писать свою собственную функцию! Большое спасибо. – felixmc

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

Смежные вопросы