tại sao unlist () giết ngày trong R


84

Khi tôi không công bố danh sách ngày, nó sẽ biến chúng trở lại thành số. Điều đó có bình thường không? Bất kỳ giải pháp nào khác ngoài việc đăng ký lại as.Date?

> dd <- as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))
> class(dd)
[1] "Date"
> unlist(dd)
[1] "2013-01-01" "2013-02-01" "2013-03-01"
> list(dd)
[[1]]
[1] "2013-01-01" "2013-02-01" "2013-03-01"

> unlist(list(dd))
[1] 15706 15737 15765

Đây có phải là một lỗi?


2
Từ ?unlist: Nếu có thể, các phần tử danh sách bị ép buộc về một chế độ chung trong quá trình hủy danh sách và do đó, kết quả thường kết thúc dưới dạng vectơ ký tự. Các vectơ sẽ bị ép buộc thành kiểu cao nhất của các thành phần trong hệ thống phân cấp NULL <nguyên <lôgic <số nguyên <thực <phức <ký tự <danh sách <biểu thức: danh sách cặp được coi như danh sách.
Arun

6
vâng tôi đã đọc hướng dẫn .... họ đã có trong một chế độ thông thường
Thomas Browne

1
Tôi đồng ý là hành vi không bình thường. Nhưng bạn luôn nên đọc tài liệu về hàm mà bạn đang sử dụng.
Arun

7
@Arun Tôi không hiểu tại sao lại có liên quan. Các vectơ ngày tháng là các số nguyên bên trong nên vấn đề thực sự là các thuộc tính bị loại bỏ. Tài liệu không đề cập đến điều này một cách rõ ràng, nhưng không có cách nào mà unlist có thể duy trì các thuộc tính nói chung.
hadley

1
@Arun yes, vì unlisttrả về các đầu vào không phải danh sách không thay đổi. Đối với tôi, nó có vẻ không quá mờ, nhưng tài liệu sẽ đề cập đến những gì xảy ra với các thuộc tính.
hadley

Câu trả lời:


94

do.calllà một chức năng tiện dụng để "làm điều gì đó" với một danh sách. Trong trường hợp của chúng tôi, hãy nối nó bằng cách sử dụng c. Nó không phải là hiếm để cbindhoặc rbinddata.frames từ một danh sách vào một data.frame lớn duy nhất.

Những gì chúng tôi đang làm ở đây thực sự là nối các phần tử của dddanh sách. Điều này sẽ tương tự như c(dd[[1]], dd[[2]]). Lưu ý rằng ccó thể được cung cấp dưới dạng một hàm hoặc một ký tự.

> dd <- list(dd, dd)
> (d <- do.call("c", dd))
[1] "2013-01-01" "2013-02-01" "2013-03-01" "2013-01-01" "2013-02-01" "2013-03-01"
> class(d) # proof that class is still Date
[1] "Date"

7
Câu trả lời này sẽ được cải thiện đáng kể nếu bạn có thể thêm một chút chi tiết giải thích những gì bạn đang làm, vì vậy những người khác sẽ thấy nó dễ đọc hơn sau này.
Dinre

Tại sao "xung quanh c?
Alessandro Jacopson 14/09/17

3
@AlessandroJacopson trích dẫn là không cần thiết (mặc dù xem tệp trợ giúp của do.call) nhưng đôi khi có thể hữu ích cho các chức năng cần được trích dẫn, ví dụ do.call("+", as.list(c(1, 1))).
Roman Luštrik 14/09/17

1
một cách tiếp cận tốt đẹp là để thực hiện việc chuyển đổi từ danh sách để vector với Reduce, ví dụ Reduce("c",dd)
Oriol Prat

2
Cảm ơn vì mã. Không trả lời câu hỏi, tho: tại sao không công khai ngày giết?
dfrankow

0

Hoặc sử dụng purrr để làm phẳng danh sách ngày tháng thành các loại bảo toàn vectơ:

list(as.Date(c("2013-01-01", "2013-02-01", "2013-03-01"))) %>% purrr::reduce(c)

kết quả trong

[1] "2013-01-01" "2013-02-01" "2013-03-01"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.