在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)
将返回所有匹配项,其中aslast(.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"]