在R中操作数据帧

在R中操作数据帧,r,dataframe,R,Dataframe,我有一个像这样的数据框 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-

我有一个像这样的数据框

   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。但是列“ID”将包含唯一的ID,DATE将包含该ID的最新日期,其余的列将具有对应于该特定ID的最新时间戳(TS_事件)的值

例如,在这种情况下,对于ID0026A,数据帧应该如下所示

   ID       DATE       X   Y  Z
ID0026A  2013-03-27    0   0  0
ID0026A  2013-01-03  100 354 25
我的数据帧包含120万条记录和6000个唯一ID

注:ID的str为字符,日期的str为日期,TS_事件的str为字符,其余为数字

因此,首先我想将TS_事件转换为日期时间对象,然后创建所需的数据帧


我怎样才能在R中做到这一点?

我希望这会有所帮助,但因为您有120万行数据。表会更好

library(plyr)
ddply(df,~ID,function(x){x[x$DATE==max(x$DATE),]})

关于数据的大小,我将使用
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
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)

使用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$TS_EVENT <- as.POSIXct(df$TS_EVENT, format="%Y-%m-%d %I:%M:%S %p", tz="UTC")
编辑: TS_事件到日期时间对象的转换可以如下所示:

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$TS_EVENT <- as.POSIXct(df$TS_EVENT, format="%Y-%m-%d %I:%M:%S %p", tz="UTC")

df$TS_事件如果日期按升序排列,则可以使用:

dat[!duplicated(dat$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"]

df我收到错误
error:需要一个值
是因为我有X、Y和Z列。如果我有3列,代码将如何更改?最新日期是唯一的还是我们可以有更多行有最新日期?是的,因此,我应该这样说:我们将考虑这个ID的最后日期。抱歉错过这个点,你可以使用<代码> df%.%GROPYBY(ID)%.%筛选器(Deal= = Deal[1](Max(日期)))< /代码>你可以发布完整的代码吗?我是RNote的新手,
Date==tail(Date,1)
将返回所有匹配项,其中as
last(.SD)
将只给出每个
ID
的最后一行。如果最晚的日期出现不止一次怎么办?也就是说,在您的示例中,如果有另一行ID=ID0026A,日期=2013-03-27,X,Y,Z=1,那么是否要输出日期=2013-03-27的两行?您的示例(必需结果)与您的问题不符。ID不唯一,并且日期不是该ID的最新日期(有两个不同的日期)。至于TS_事件到日期时间对象的转换,您可以在我(原始)的回复中看到如何进行。@Arun感谢您指出!我相应地修改了我的答案。
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"]