根据r中的唯一ID在列中查找最小值

时间:2013-11-09 23:44:10

标签: r excel minimum

需要一些简单的r命令帮助做一些通过excel中的pivot完成的事情。 我有一个包含2个变量ID和日期的表。我需要一个可以创建数据框的命令,该数据框具有这些ID的唯一列表以及针对ID的最小日期。

例如,假设我的数据框是转置(ID列表是col 1而Date2是col 2)

ID:    ID1 ID1 ID2 ID2 ID3
Date: Mar 01 Mar 02 Mar03 Mar 04 Mar 05

我需要一个提供

的数据框
ID1  Mar01
ID2  Mar03
ID3  Mar05

2 个答案:

答案 0 :(得分:0)

这里的关键是使用as.Date作为日期数据类型,并使用其中给出的格式之一,请参阅?format.Date格式类型。让我们创建一个输入表的示例: df_input<-data.frame(ID=sample(1:5), Date=as.Date(sample(c("2012-10-03", "2012-11-03", "2012-12-03"), size= 5,replace=T))) 现在使用sort对输入数据框进行排序。喜欢: sort(df_input$Date)

祝你有美好的一天!另外,如果您需要帮助导入文件,请尝试:Unable to import data from a sample Excel file

答案 1 :(得分:0)

以下是我对此的解释。

您的首字母data.frame就是这样的。 (我在data.frame添加了一个额外的无序值,所以我的回答与你的不同。)

mydf <- data.frame(ID = c("ID1", "ID1", "ID2", "ID2", "ID3", "ID3"),
                   Date = c("Mar 01", "Mar 02", "Mar 03", "Mar 04", "Mar 05", "Mar 04"))
mydf
#    ID   Date
# 1 ID1 Mar 01
# 2 ID1 Mar 02
# 3 ID2 Mar 03
# 4 ID2 Mar 04
# 5 ID3 Mar 05
# 6 ID3 Mar 04

首先,在“日期”列中创建实际的“日期”对象。我假设您的日期格式为“星期一”,因此我在"%b %d"中使用了strptime。由于没有年份,因此假设当前年份。

Date2 <- strptime(mydf$Date, format="%b %d")  ## ASSUMES THE CURRENT YEAR
Date2
# [1] "2013-03-01" "2013-03-02" "2013-03-03" "2013-03-04" "2013-03-05" "2013-03-04"

接下来,找到一个允许我们通过“ID”变量订购这些日期的功能。在基数R中,ave非常方便。

ave(as.numeric(Date2), mydf$ID, FUN = order)
# [1] 1 2 1 2 2 1

将这些值用于每个ID的第一个(最低)值的子集(即,结果等于“1”的位置)。

mydf[ave(as.numeric(Date2), mydf$ID, FUN = order) == 1, ]
#    ID   Date
# 1 ID1 Mar 01
# 3 ID2 Mar 03
# 6 ID3 Mar 04