从POSIXlt中提取日期元素并放入R中的数据帧中
我今天的第二个问题,也是我最后一次尝试使用R清理这些数据。以下是sitrep: 我有一个数据框,它有一个POSIXlt日期类型的列。我想从该列中提取日、月和年,并创建3个新列,称为(巧妙地)日、月和年 数据框如下所示:从POSIXlt中提取日期元素并放入R中的数据帧中,r,R,我今天的第二个问题,也是我最后一次尝试使用R清理这些数据。以下是sitrep: 我有一个数据框,它有一个POSIXlt日期类型的列。我想从该列中提取日、月和年,并创建3个新列,称为(巧妙地)日、月和年 数据框如下所示: order_id dd_mmm_yy 1 2005-07-28 2 2007-03-04 我想以这个结尾: order_id dd_mmm_yy day month year 1
order_id dd_mmm_yy
1 2005-07-28
2 2007-03-04
我想以这个结尾:
order_id dd_mmm_yy day month year
1 2005-07-28 28 7 2005
2 2007-03-04 4 3 2007
我创建了一个函数来提取日、月和年,并将它们返回到列表(或数据框,我尝试了两者)
以下是我根据之前的一个问题所做的尝试:
cbind(orders, t(sapply(orders$dd_mmm_yy, extractdate)))
这就给了我:
Error in data.frame(..., check.names = FALSE) :
arguments imply differing number of rows: 5, 9
因为某种疯狂的原因,t(sapply…)本身给了我这个:
day month year
sec Character,5 Character,5 Character,5
min Character,5 Character,5 Character,5
hour Character,5 Character,5 Character,5
mday Character,5 Character,5 Character,5
mon Character,5 Character,5 Character,5
year Character,5 Character,5 Character,5
wday Character,5 Character,5 Character,5
yday Character,5 Character,5 Character,5
isdst Character,5 Character,5 Character,5
到底发生了什么?在将这些数据引入R进行分析之前,我是否最好使用Python或Java之类的工具来对这些数据进行所有需要的数据操作?试试这个(DF作为您的data.frame):
extractdatePOSIXlt
对象是一个包含9个组件的列表(有关更多信息,请参阅?POSIXlt
的详细信息部分)。因为dd_mmm_yy
列是POSIXlt
,您不需要函数来提取组件。您只需按组件名称提取组件即可:
orders$day <- orders$dd_mmm_yy$mday # day of month
orders$month <- orders$dd_mmm_yy$mon+1 # month of year (zero-indexed)
orders$year <- orders$dd_mmm_yy$year+1900 # years since 1900
orders
# order_id dd_mmm_yy day month year
# 1 1 2005-07-28 28 7 2005
# 2 2 2007-03-04 4 3 2007
订购$day使用lubridate的一个衬里
require(plyr); require(lubridate)
mutate(mydf, date = ymd(dd_mmm_yy), day = day(date),
month = month(date), year = year(date))
order_id dd_mmm_yy date day month year
1 1 2005-07-28 2005-07-28 28 7 2005
2 2 2007-03-04 2007-03-04 4 3 2007
如果您使用的是data.table
包,那么它已经具备了从POSIXct提取数据时间组件的功能
second(x)
minute(x)
hour(x)
yday(x)
wday(x)
mday(x)
week(x)
isoweek(x)
month(x)
quarter(x)
year(x)
使用非常简单(例如,dt[,day:=day(dd_mmm_yy)]
)。您可以查看完整的文档。谢谢!这非常有效。我知道必须有一个简单的解决方案。此解决方案有问题,请检查下面的内容。@user1034797:此解决方案没有问题。您假设我更改了POSIXlt对象的元素,但我没有更改。
require(plyr); require(lubridate)
mutate(mydf, date = ymd(dd_mmm_yy), day = day(date),
month = month(date), year = year(date))
order_id dd_mmm_yy date day month year
1 1 2005-07-28 2005-07-28 28 7 2005
2 2 2007-03-04 2007-03-04 4 3 2007
second(x)
minute(x)
hour(x)
yday(x)
wday(x)
mday(x)
week(x)
isoweek(x)
month(x)
quarter(x)
year(x)