2011-11-14 43 views
12

Câu hỏi thứ hai của tôi trong ngày và nỗ lực cuối cùng của tôi để sử dụng R để xóa dữ liệu này. Đây là sơ đồ trang web:Trích xuất các yếu tố ngày từ POSIXlt và đưa vào khung dữ liệu trong R

Tôi có khung dữ liệu có cột là loại ngày POSIXlt. Tôi muốn trích xuất ngày, tháng và năm từ cột đó và tạo ra 3 cột mới được gọi là (khéo léo) ngày, tháng và năm.

Khung dữ liệu trông như thế này:

order_id  dd_mmm_yy 
    1   2005-07-28 
    2   2007-03-04 

Tôi muốn kết thúc với điều này:

order_id  dd_mmm_yy day month year 
    1   2005-07-28 28  7  2005 
    2   2007-03-04 4  3  2007 

tôi đã tạo ra một hàm để trích xuất các ngày, tháng, năm và trả lại trong một danh sách (hoặc khung dữ liệu, tôi đã thử cả hai).

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) 
} 

Đây là những gì tôi đã cố gắng dựa trên một vấn đề trước đó và câu hỏi:

cbind(orders, t(sapply(orders$dd_mmm_yy, extractdate))) 

mà mang lại cho tôi điều này:

Error in data.frame(..., check.names = FALSE) : 
arguments imply differing number of rows: 5, 9 

Các t (sapply ... bởi chính nó mang đến cho cho tôi một số lý do điên rồ:

 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 

Wh trên trái đất đang diễn ra? Tôi có tốt hơn bằng cách sử dụng một cái gì đó như Python hay Java để làm tất cả các thao tác dữ liệu tôi cần phải làm trên dữ liệu này trước khi đưa nó vào R để phân tích?

Trả lời

21

POSIXlt đối tượng là một danh sách các thành phần 9 (xem phần Thông tin chi tiết của ?POSIXlt để biết thêm thông tin). Vì cột dd_mmm_yyPOSIXlt, bạn không cần chức năng để trích xuất các thành phần. Bạn chỉ có thể trích xuất các thành phần bằng tên của họ:

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 
+0

Cảm ơn! Điều đó làm việc hoàn hảo. Tôi biết phải có một giải pháp đơn giản. –

+0

Đã xảy ra sự cố với giải pháp này, hãy kiểm tra bên dưới. – mmann1123

+0

@ user1034797: không có vấn đề với giải pháp này. Bạn cho rằng tôi thay đổi các phần tử của đối tượng POSIXlt mà tôi không làm. –

2

Hãy thử điều này (DF như data.frame của bạn):

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)) 
9

Một lót bằng 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 
Các vấn đề liên quan