我当天的第二个问题以及我最后一次尝试使用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 2005-07-28 28 7 2005
2 2007-03-04 4 3 2007
我已经创建了一个函数来提取日,月和年并将它们返回到列表中(或者数据框中,我已经尝试过了)。
extractdate = function (date) {
day = format(date, format="%d")
month = format(date, format="%m")
year = format(date, format="%Y")
list(day=day, month=month, year=year)
}
以下是我根据之前的问题和问题尝试的内容:
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
到底是怎么回事?我最好使用像Python或Java这样的东西来完成我需要对这些数据进行的所有数据操作,然后再将它带入R进行分析吗?
答案 0 :(得分:24)
POSIXlt
个对象是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
答案 1 :(得分:9)
使用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
答案 2 :(得分:2)
试试这个(DF作为你的data.frame):
extractdate <- function(date) {
day <- format(date, format="%d")
month <- format(date, format="%m")
year <- format(date, format="%Y")
cbind(day, month, year)
}
cbind(DF, extractdate(DF$dd_mmm_yy))
答案 3 :(得分:0)
如果您使用的是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)]
)。您可以查看完整的文档here。