अनलिस्ट () आर में तारीखों को क्यों मारता है


84

जब मैं तारीखों की एक सूची को हटाता हूँ तो यह उन्हें अंकशास्त्र में बदल देता है। क्या यह सामान्य है? के रूप में फिर से आवेदन के अलावा किसी भी वैकल्पिक हल।

> 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

क्या यह एक बग है?


2
से ?unlist: जहां संभव हो सूची तत्वों को असूचीबद्ध करने के दौरान एक सामान्य मोड में ले जाया जाता है, और इसलिए परिणाम अक्सर एक चरित्र वेक्टर के रूप में समाप्त होता है। सेक्टरों को पदानुक्रम में उच्चतम प्रकार के घटकों के लिए बाध्य किया जाएगा NULL <कच्चे <तार्किक <पूर्णांक <वास्तविक <जटिल <चरित्र <सूची <अभिव्यक्ति: pairlists को सूचियों के रूप में माना जाता है।
अरुण

6
हां, मैंने मैनुअल पढ़ा .... वे पहले से ही एक सामान्य मोड में हैं
थॉमस ब्राउन

1
मैं मानता हूं कि व्यवहार सामान्य नहीं है। लेकिन आपके द्वारा उपयोग किए जा रहे फ़ंक्शन के प्रलेखन को पढ़ने के लिए हमेशा अनुशंसा की जाती है।
अरुण

7
@ अगर मैं यह नहीं देखता कि यह प्रासंगिक क्यों है। दिनांक वैक्टर आंतरिक रूप से पूर्णांक होते हैं इसलिए समस्या वास्तव में यह है कि विशेषताओं को छीन लिया जाता है। दस्तावेज़ में इसका स्पष्ट उल्लेख नहीं है, लेकिन ऐसा कोई तरीका नहीं है जो सामान्य रूप से विशेषताओं को संरक्षित कर सके।
हैवली

1
@ हां, क्योंकि unlistगैर-सूची इनपुट अपरिवर्तित देता है। यह मुझे बिल्कुल धुंधला नहीं लगता, लेकिन दस्तावेज़ीकरण में यह उल्लेख होना चाहिए कि विशेषताओं का क्या होता है।
वॉली

जवाबों:


94

do.callएक सूची के साथ "कुछ करने के लिए" एक आसान कार्य है। हमारे मामले में, इसका उपयोग करके संक्षिप्त करें c। यह एक सूची से असामान्य cbindया rbinddata.frames के लिए एक बड़ा data.frame में असामान्य नहीं है ।

हम यहां जो कर रहे हैं, वह वास्तव में ddसूची के तत्वों का संघटन है । यह अनुरूप होगा c(dd[[1]], dd[[2]])। ध्यान दें कि cएक फ़ंक्शन के रूप में या एक चरित्र के रूप में आपूर्ति की जा सकती है।

> 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?
एलेसैंड्रो जैकप्सन

3
@AlessandroJacopson उद्धरण आवश्यक नहीं है (हालांकि मदद फ़ाइल देखें do.call), लेकिन कभी-कभी उन कार्यों के लिए आसान हो सकता है जिन्हें उद्धृत करने की आवश्यकता होती है, जैसे do.call("+", as.list(c(1, 1)))
रोमन लुसट्रिक

1
एक और अच्छा तरीका यह है कि लिस्ट से सदिश के लिए रूपांतरण का प्रदर्शन किया जाए Reduce, यानी Reduce("c",dd)
ओरोल प्रात

2
कोड के लिए धन्यवाद। इस सवाल का जवाब नहीं देता, थियो: अनलिस्ट्स डेट्स को क्यों मारता है?
dfrankow

0

या वेक्टर संरक्षित प्रकारों के लिए तारीखों की सूची को समतल करने के लिए purrr का उपयोग करना:

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

का परिणाम

[1] "2013-01-01" "2013-02-01" "2013-03-01"
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.