[英]Manipulating dataframe in R
我有一個數據框
ID DATE TS_EVENT X Y Z
ID0026A 2013-01-03 2013-01-03 8:31:09 PM 25 0 0
ID0026A 2013-01-03 2013-01-03 8:31:09 PM 0 0 0
ID0026A 2013-01-03 2013-01-03 11:22:55 PM 0 0 0
ID0026A 2013-01-03 2013-01-03 11:36:05 PM 0 0 0
ID0026A 2013-01-03 2013-01-03 11:36:05 PM 0 0 0
ID0026A 2013-03-27 2013-01-03 11:36:05 PM 100 354 25
現在,我想返回一個具有四列ID,DATE,X,Y和Z的數據框。但是col“ ID”將包含唯一的ID,DATE將包含該ID的最新日期以及其余cols將具有對應於該特定ID的最新時間戳(TS_EVENT)的值。
例如,在這種情況下,對於ID0026A,數據幀應類似於
ID DATE X Y Z
ID0026A 2013-03-27 0 0 0
ID0026A 2013-01-03 100 354 25
我的數據框包含120萬條記錄和6000個唯一ID
注意:ID的字符串是字符,DATE的字符串是日期,TS_EVENT的字符串是字符,其余數字
因此,首先,我想將TS_EVENT轉換為日期時間對象,然后創建所需的數據框。
我如何在R中做到這一點?
關於您的數據大小,我將使用data.table
解決方案。
如果您的數據已經排序:
library(data.table)
DT <- as.data.table(dat)
DT[,tail(.SD,1),'ID']
# ID DATE X Y Z
# 1: ID0026A 2013-03-27 100 354 25
除此以外:
DT[,.SD[which.max(as.Date(DATE)),],'ID']
PS:dat是:
dat <- read.table(text=" ID DATE X Y Z
ID0026A 2013-01-03 25 0 0
ID0026A 2013-01-03 0 0 0
ID0026A 2013-01-03 0 0 0
ID0026A 2013-01-03 0 0 0
ID0026A 2013-01-03 0 0 0
ID0026A 2013-03-27 100 354 25",header=T)
在data.table
的開發版本中, data.table
參數fromLast
於data.table的duplicated
方法和unique
方法。 因此,您可以這樣做(假設該列按ID, DATE
排序:
require(data.table) ## >= 1.9.3
unique(setDT(dat), by=c("ID"), fromLast=TRUE)
這是三種方法:
df <- read.table(header=T, text="ID DATE X Y Z
ID0026A 2013-01-03 25 0 0
ID0026A 2013-01-03 0 0 0
ID0026A 2013-01-03 0 0 0
ID0026A 2013-01-03 0 0 0
ID0026A 2013-01-03 0 0 0
ID0026A 2013-03-27 100 354 25
ID0026B 2013-12-03 0 1 1
ID0026B 2013-11-03 0 0 0", colClasses=c("factor", "Date", rep("integer", 3)))
aggregate(df[order(df$DATE), ], list(df$ID), tail, 1)[-1]
library(dplyr)
df %.%
arrange(DATE) %.%
group_by(ID) %.%
filter(DATE == tail(DATE, 1))
library(data.table)
dt <- data.table(df, key=c("DATE"))
dt[, last(.SD), by="ID"]
您可以使用dplyr軟件包輕松地做到這一點:
x <- data.frame(ID=c(1,2,2), DATE=c("2012-01-03","2013-03-01","2013-03-02"), X=c(4,5,6))
df <- group_by(x,ID)
summarise(df, date=DATE[which.max(DATE)], X=X[which.max(DATE)])
如果可能有多個最新日期,那么您可以這樣做
# df is the name of your dataframe
library(dplyr)
df %.% group_by(ID) %.% filter(DATE==DATE[which.max(DATE)])
編輯:TS_EVENT到日期時間對象的轉換可以像這樣完成:
df$TS_EVENT <- as.POSIXct(df$TS_EVENT, format="%Y-%m-%d %I:%M:%S %p", tz="UTC")
如果日期按升序排列,則可以使用:
dat[!duplicated(dat$ID, fromLast = TRUE), ]
我希望這會有所幫助,但是由於您有120萬行數據,因此table會更好
library(plyr)
ddply(df,~ID,function(x){x[x$DATE==max(x$DATE),]})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.