2015-10-30 92 views
2

我的數據GROUP BY和選擇分鐘日期data.table

df1 <- structure(list(ID = c("A", "A", "A", "B", "B", "C"), c1 = 1:6, 
c2 = 1:6, myDate = c("01.01.2015", "02.02.2014", "03.01.2014", 
"09.09.2009", "10.10.2010", "06.06.2011")), .Names = c("ID", 
"c1", "c2", "myDate"), class = "data.frame", row.names = c(NA,-6L)) 

我需要的輸出(注:DF,保持所有列!):

ID c1 c2 myDate 
A  3  3  03.01.2014 
B  4  4  09.09.2009 
C  6  6  06.06.2011 
.... 

我的代碼

library(data.table) 
setDT(df1) 
df1[,myDate:=as.Date(myDate, "%d.%m.%Y")] 
test2 <- df1[,.(myDate == min(myDate)), by = ID] 

這給了我在我的相應列(指明MyDate)邏輯中的條件匹配的位置。但是,那不是df和所有其他列丟失。我對data.table軟件包相當陌生,因此不勝感激。

+0

回答你的其他問題看起來很充分:http://stackoverflow.com/a/33417481/1191259 – Frank

+0

這個問題的更確切的複製品是http://stackoverflow.com/ q/16573995/1191259 – Frank

+1

@Frank感謝您的第二個鏈接。我發表第二個問題的原因是因爲我沒有正確理解答案。 – Stophface

回答

4

我們可以使用which.min獲得索引並使用.SD獲得Data.table的子集。

setDT(df1)[, .SD[which.min(as.Date(myDate, '%d.%m.%Y'))], by = ID] 
# ID c1 c2  myDate 
#1: A 3 3 03.01.2014 
#2: B 4 4 09.09.2009 
#3: C 6 6 06.06.2011 

或者有關係,我們需要所有的min值的行,使用==

setDT(df1)[, {tmp <- as.Date(myDate, '%d.%m.%Y'); .SD[tmp==min(tmp)] }, ID] 
#ID c1 c2  myDate 
#1: A 3 3 03.01.2014 
#2: B 4 4 09.09.2009 
#3: C 6 6 06.06.2011 

其他選項將是獲得行索引(.I),然後子集。這將是快

setDT(df1)[df1[, .I[which.min(as.Date(myDate, '%d.%m.%Y'))], ID]$V1] 
# ID c1 c2  myDate 
#1: A 3 3 03.01.2014 
#2: B 4 4 09.09.2009 
#3: C 6 6 06.06.2011 
+0

整潔。你能指出我的地方,在那裏我可以閱讀更多關於'I'和'SD' – Stophface

+0

@Chrissi嘗試[這裏](https://cran.r-project.org/web/packages/data.table/vignettes/datatable- intro.pdf)和[這裏](https://cran.r-project.org/web/packages/data.table/vignettes/datatable-faq.pdf)爲了解多一點。 – akrun