在r中快速排序数据并删除重复项

时间:2016-01-29 18:19:37

标签: r sorting

我有一个名为Test

的格式的数据框
Names  Category Date        
Ashley  A       29/01  
Ashley  M       28/01    
Ashley  M       27/01   
Bob     A       16/01   
Charles M       12/01  
Mary    A       25/01  
Mary    M       27/01  

我希望按日期对数据进行排序,并通过删除重复项来仅选择数据框中的最新元素。

所以输出应该像

Name       Cat      Date    
Ashley     A        29/01  
Bob        A        16/01    
Charles    M        12/01  
Mary       M        27/01  

2 个答案:

答案 0 :(得分:2)

按照您给出的顺序,仅使用base:

isset()

假设您的数据是存储在"数据"下的data.frame。 然后输出是:

ordered <- data[order(data$Date,decreasing=TRUE),]
unique <- ordered[!duplicated(ordered$Names),]

答案 1 :(得分:1)

我们可以使用data.table。将'data.frame'转换为'data.table'(setDT(Test)),然后将order转换为'Names'和'Date'(转换为Date类后),并删除与!duplicated

重复
library(data.table)
setDT(Test)[order(Names,-as.Date(paste0(Date, '/01'), 
                      '%d/%m/%y'))][!duplicated(Names)]
#     Names Category  Date
#1:  Ashley        A 29/01
#2:     Bob        A 16/01
#3: Charles        M 12/01
#4:    Mary        M 27/01

unique之后,by选项orderunique(setDT(Test)[order(Names,-as.Date(paste0(Date, '/01'), '%d/%m/%y'))], by = 'Names') 选项

%d/%m

注意:目前尚不清楚“日期”格式是%d/%y还是paste。上面的代码%d/%m/%y'01'并使用格式%d/%y/%m(假设缺少'year')。如果缺少“月份”,请使用base R作为格式)

如果我们需要使用 i1 <- with(Test, order(Names, -as.numeric(as.Date(paste0(Date, '/01'), '%d/%m/%y')))) Test[i1,][!duplicated(Test$Names),] # Names Category Date #1 Ashley A 29/01 #4 Bob A 16/01 #5 Charles M 12/01 #7 Mary M 27/01 ,则等效方法是

Test <- structure(list(Names = c("Ashley", "Ashley", "Ashley", "Bob", 
"Charles", "Mary", "Mary"), Category = c("A", "M", "M", "A", 
"M", "A", "M"), Date = c("29/01", "28/01", "27/01", "16/01", 
"12/01", "25/01", "27/01")), .Names = c("Names", "Category", 
"Date"), class = "data.frame", row.names = c(NA, -7L))

注意:这与OP的帖子中显示的预期输出顺序相同。

数据

var clientManager = new BasicRedisClientManager("127.0.0.1");
var client = clientManager.GetClient();
client.Db = 3; // set the DB to 3
var item = DateTime.Now.Ticks.ToString();
client.AddItemToList("test_q", item);