मेरे पास एक by है जो SubDataFrames बनाता है। मैं इन्हें डेटाफ़्रेम में कैसे बदलूँ, अधिमानतः बिना कॉपी किए?

मेरी मूल समस्या यह है कि मैं SubDataFrame में एक नया कॉलम नहीं जोड़ सकता:

# df[:End] = 1:nrow(merged_islands)
# ERROR: LoadError: Cannot assign to non-existent column: End

# insert!(df, length(df), Array(1:nrow(merged_islands)), :End)
# ERROR: LoadError: MethodError: no method matching insert!(::SubDataFrame{Array{Int64,1}}, ::Int64, ::Array{Int64,1}, ::Symbol)

मैं अनुमान लगा रहा हूं कि इसे डेटाफ्रेम में परिवर्तित करना इसे करने का सबसे आसान तरीका है :)

3
The Unfun Cat 25 सितंबर 2018, 10:51

1 उत्तर

सबसे बढ़िया उत्तर

एक दिलचस्प सवाल। वर्तमान मास्टर पर (बहुत जल्द टैग किया जाएगा) यह लिखने के लिए पर्याप्त है DataFrame(sdf) जहां sdf एक SubDataFrame है। हालांकि यह सभी वैक्टरों की एक प्रति बनाएगा।

यहां एक समाधान है जो SubDataFrame में निहित सभी वैक्टरों के view के साथ एक DataFrame बनाएगा (इसे मास्टर और वर्तमान में टैग की गई रिलीज़ दोनों पर काम करना चाहिए):

function sdf2df(sdf::SubDataFrame)
    p = parent(sdf)
    sel = DataFrames.rows(sdf)
    DataFrame(AbstractVector[view(p[i], sel) for i in 1:ncol(sdf)],
              names(sdf))
end

(मैं AbstractVector कंटेनर प्रकार का उपयोग करता हूं क्योंकि यह वर्तमान मास्टर पर तेज़ होगा)

आप ऐसे DataFrame में पंक्तियों को जोड़ने में सक्षम नहीं होंगे, जबकि इसमें कम से कम एक view कॉलम है।

संपादित करें: एक साइड नोट के रूप में (शायद यह अंत में आपकी समस्या थी)। यदि आपके पास sdf है, जो एक SubDataFrame है, जिसका जनक df है, जो एक DataFrame है, तो यदि आप df में कॉलम जोड़ते हैं, तो वे तुरंत df में दिखाई देंगे। sdf के रूप में SubDataFrame केवल पंक्तियों का चयन करता है और माता-पिता से सभी कॉलम प्राप्त करता है।

2
Bogumił Kamiński 25 सितंबर 2018, 11:17