簡體   English   中英

在R中操縱數據框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM