2012-05-04 45 views
40

मैंने अपने कॉलम नामों में question about this a few months back से पूछा, और मैंने सोचा कि जवाब ने मेरी समस्या हल कर दी है, लेकिन मैं फिर से समस्या में भाग गया और समाधान मेरे लिए काम नहीं करता था।एक्स। आर डेटा फ्रेम

मैं एक CSV आयात करने हूँ:

orders <- read.csv("<file_location>", sep=",", header=T, check.names = FALSE) 

यहाँ dataframe की संरचना है:

str(orders) 

'data.frame': 3331575 obs. of 2 variables: 
$ OrderID : num -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ... 
$ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ... 

अगर मैं पहले कॉलम पर length आदेश चला, OrderID, मैं इस मिल:

length(orders$OrderID) 
[1] 0 

यदि मैं ऑर्डरडेट पर length चलाता हूं, तो यह सी देता है orrectly:

length(orders$OrderDate) 
[1] 3331575 

यह एक कॉपी/CSV की head का पेस्ट है।

OrderID,OrderDate 
-2034590217,2011-10-14 
-2034590216,2011-10-14 
-2031892773,2011-10-24 
-2031892767,2011-10-21 
-2021008573,2011-12-08 
-2021008572,2011-12-07 
-2021008571,2011-12-07 
-2021008570,2011-12-07 
-2021008569,2011-12-07 

अब, अगर मैं फिर से चलाने के read.csv, लेकिन check.names विकल्प बाहर ले, dataframe का पहला स्तंभ अब नाम के शुरू में एक एक्स है।

orders2 <- read.csv("<file_location>", sep=",", header=T) 

str(orders2) 

'data.frame': 3331575 obs. of 2 variables: 
$ X.OrderID: num -2034590217 -2034590216 -2031892773 -2031892767 -2021008573 ... 
$ OrderDate: Factor w/ 402 levels "2010-10-01","2010-10-04",..: 263 263 269 268 301 300 300 300 300 300 ... 

length(orders$X.OrderID) 
[1] 3331575 

यह सही ढंग से काम करता है।

मेरा प्रश्न है कि R पहले कॉलम नाम की शुरुआत के लिए एक्स जोड़ें। जैसा कि आप सीएसवी फ़ाइल से देख सकते हैं, कोई विशेष वर्ण नहीं हैं। यह एक साधारण भार होना चाहिए। check.names जोड़ना, जबकि सीएसवी से नाम आयात करेगा, डेटा को विश्लेषण करने के लिए मेरे लिए सही ढंग से लोड नहीं होगा।

इसे ठीक करने के लिए मैं क्या कर सकता हूं?

साइड नोट: मुझे एहसास है कि यह एक नाबालिग है - मैं इस तथ्य से और अधिक निराश हूं कि मुझे लगता है कि मैं सही ढंग से लोड कर रहा हूं, फिर भी मुझे उम्मीद नहीं मिल रही है। मैं colnames(orders)[1] <- "OrderID" का उपयोग कर कॉलम का नाम बदल सकता हूं, लेकिन अभी भी जानना चाहता हूं कि यह सही तरीके से क्यों लोड नहीं होता है।

+0

क्या आप निम्न आउटपुट काट और पेस्ट कर सकते हैं uts: 'सिर (ऑर्डर)' & 'हेड (ऑर्डर 2)'? –

+3

मैं वास्तविक कच्ची सीएसवी फ़ाइल देखने के लिए उत्सुक हूं। क्या आप इसे कहीं पोस्ट कर सकते हैं और एक लिंक प्रदान कर सकते हैं ताकि हम इसे डाउनलोड कर सकें और इस व्यवहार को पुन: उत्पन्न करने का प्रयास कर सकें। जो भी समस्या है, मेरा अनुमान है कि उत्तर सटीक संरचना और फ़ाइल की सामग्री में निहित है। – joran

+0

मुझे आदेशों का str नहीं मिलता है लेकिन फिर 'लंबाई (ऑर्डर $ ऑर्डर आईडी) [1] 0' –

उत्तर

54

read.csv() अधिक सामान्य read.table() फ़ंक्शन के आसपास एक रैपर है। यही कारण है कि बाद के समारोह तर्क check.names जो के रूप में दर्ज है है:

check.names: logical. If ‘TRUE’ then the names of the variables in the 
     data frame are checked to ensure that they are syntactically 
     valid variable names. If necessary they are adjusted (by 
     ‘make.names’) so that they are, and also to ensure that there 
     are no duplicates. 

अपने हैडर लेबल है कि तब वाक्य रचना मान्य नहीं हैं तो make.names() उन्हें कोई मान्य नाम के साथ बदल देगा, अमान्य नाम पर आधारित, अवैध को हटाने वर्ण और संभवतः X prepending:

R> make.names("$Foo") 
[1] "X.Foo" 

यह ?make.names में दर्ज है:

+०१२३५१६४१०६
Details: 

    A syntactically valid name consists of letters, numbers and the 
    dot or underline characters and starts with a letter or the dot 
    not followed by a number. Names such as ‘".2way"’ are not valid, 
    and neither are the reserved words. 

    The definition of a _letter_ depends on the current locale, but 
    only ASCII digits are considered to be digits. 

    The character ‘"X"’ is prepended if necessary. All invalid 
    characters are translated to ‘"."’. A missing value is translated 
    to ‘"NA"’. Names which match R keywords have a dot appended to 
    them. Duplicated values are altered by ‘make.unique’. 

व्यवहार आप देख रहे हैं प्रलेखित तरह से आपके डेटा में read.table() लोड के साथ पूरी तरह से संगत है। यह सुझाव देगा कि आपके सीएसवी फ़ाइल की हेडर पंक्ति में आपके पास सिंटैक्टिक रूप से अमान्य लेबल हैं।?make.names से ऊपर की ओर ध्यान दें कि एक पत्र क्या है आपके सिस्टम के लोकेल पर निर्भर करता है; सीएसवी फ़ाइल में एक वैध वर्ण शामिल हो सकता है कि आपका टेक्स्ट एडिटर प्रदर्शित होगा लेकिन यदि आर उसी लोकेल में नहीं चल रहा है तो चरित्र वहां मान्य नहीं हो सकता है, उदाहरण के लिए?

मैं सीएसवी फ़ाइल को देखता हूं और हेडर लाइन में किसी भी गैर-ASCII वर्णों की पहचान करता हूं; शीर्षलेख पंक्ति में संभवतः गैर-दृश्यमान वर्ण (या बचने के दृश्य; \t?) हैं। फ़ाइल में गैर-वैध नामों के साथ पढ़ने और इसे कंसोल में प्रदर्शित करने के बीच बहुत कुछ चल रहा है जो गैर-मान्य वर्णों को मुखौटा कर सकता है, इसलिए इस तथ्य को न लें कि यह check.names के बिना कुछ भी गलत नहीं दिखाता है यह दर्शाता है कि फ़ाइल ठीक है।

sessionInfo() के आउटपुट को पोस्ट करना भी उपयोगी होगा।

+0

अच्छा जवाब गेविन +1 मुझे आश्चर्य है कि शीर्षलेख नाम के सामने एक जगह है 'make.names ("Foo")' 'x.Foo 'बनाता है। –

+0

कोई जगह नहीं है जैसा मैंने कोशिश की [यहां सीएसवी का लिंक है] (http://dl.dropbox.com/u/61803503/TEST.csv) और यहां कोड है: 'x <-" http: //dl.dropbox.com/u/61803503/TEST.csv "; (डेटा <-read.csv (url (x), हेडर = TRUE)) 'और सामने या अवधि में एक स्थान ने इसे प्रभावित नहीं किया लेकिन' $ 'और', 'do। –

+0

क्या 'एक्स' के बजाए एक अलग चरित्र का उपयोग करना संभव है? – Dan

8

मैं अभी इस समस्या से आया हूं और यह एक साधारण कारण के लिए था। मेरे पास लेबल थे जो एक संख्या से शुरू हुए थे, और आर उन सभी के सामने एक एक्स जोड़ रहा था। मुझे लगता है कि आर हेडर में एक संख्या के साथ उलझन में है और मूल्यों से अलग करने के लिए एक पत्र लागू करता है।

तो, "3_in" "X3_in" आदि बन गया ... मैंने लेबल को "in_3" में स्विच करके हल किया और मुद्दों का समाधान हो गया।

मुझे आशा है कि इससे किसी की मदद मिलेगी।

+1

धन्यवाद मैट। आपने व्यवस्थित रूप से "एक्स" को कैसे हटाया। और "इन_" के साथ सभी कॉलम संलग्न करें? –

3

मैं एक समान समस्या से भाग गया और कॉलम नामों को सही करने के लिए कोड की निम्नलिखित पंक्तियां साझा करना चाहता था। निश्चित रूप से सही नहीं है, क्योंकि फोरहैंड में स्वच्छ प्रोग्रामिंग बेहतर होगा, लेकिन जल्दी और गंदे दृष्टिकोण के रूप में किसी को प्रारंभिक बिंदु के रूप में सहायक हो सकता है। (मुझे उन्हें रयान के प्रश्न/गेविन के जवाब पर टिप्पणी के रूप में जोड़ना अच्छा लगेगा, लेकिन मेरी प्रतिष्ठा काफी अधिक नहीं है, इसलिए मुझे एक अतिरिक्त उत्तर पोस्ट करना पड़ा - क्षमा करें)।

मेरे मामले में लेखन और पढ़ने के डेटा के कई कदमों ने "एक्स", एक्स .1 "नामक एक या अधिक स्तंभों का उत्पादन किया, ... एक्स -1 कॉलम और पंक्ति संख्याओं में X.1 में सामग्री शामिल है .. ।-स्तंभों। मेरे मामले में एक्स-स्तंभ की सामग्री पंक्ति नाम और अन्य X.1 के रूप में इस्तेमाल किया जाना चाहिए, ...- कॉलम हटा दिया जाना चाहिए।

Correct_Colnames <- function(df) { 

delete.columns <- grep("(^X$)|(^X\\.)(\\d+)($)", colnames(df), perl=T) 

    if (length(delete.columns) > 0) { 

    row.names(df) <- as.character(df[, grep("^X$", colnames(df))]) 
    #other data types might apply than character or 
    #introduction of a new separate column might be suitable 

    df <- df[,-delete.columns] 

    colnames(df) <- gsub("^X", "", colnames(df)) 
    #X might be replaced by different characters, instead of being deleted 
    } 

    return(df) 
} 
0

मैं शामिल करके एक ऐसी ही समस्या हल row.names = write.csv फ़ंक्शन में एक तर्क के रूप में FALSE। write.csv को पंक्ति नामों को CSV फ़ाइल में एक अनाम कॉलम के रूप में शामिल किया गया था और read.csv उस कॉलम 'एक्स' नामकरण कर रहा था जब यह CSV फ़ाइल पढ़ता था।

संबंधित मुद्दे