2012-02-01 15 views
5

मेरे पास R में डेटाफ्रेम है जिसे मैंने CSV फ़ाइल से लोड किया है। चरों में से एक को "राशि" कहा जाता है और इसका अर्थ सकारात्मक और नकारात्मक संख्याओं में होना है।आर - फैक्टर से न्यूमेरिक या इंटीजर त्रुटि

जब मैंने डेटा फ्रेम को देखा, तो इस चर के डेटाटाइप को एक कारक के रूप में सूचीबद्ध किया गया है, और मुझे इसे एक संख्यात्मक प्रारूप में चाहिए (सुनिश्चित नहीं है कि किस तरह का - पूर्णांक - संख्यात्मक, umm ...?)। इसलिए, मैंने इसे दो प्रारूपों में से एक में बदलने की कोशिश की लेकिन कुछ दिलचस्प व्यवहार देखा।

प्रारंभिक dataframe:

str(df) 

Amount  : Factor w/ 11837 levels "","-1","-10",..: 2 2 1664 4 6290 6290 6290 6290 6290 6290 ... 

मैं ऊपर उल्लेख किया है, मैं कुछ अजीब देखा जब मैं इसे या तो संख्यात्मक या पूर्णांक में बदलने की कोशिश की।

df2 <- data.frame(df$Amount, as.numeric(df$Amount), as.integer(df$Amount)) 

str(df2) 
'data.frame': 2620276 obs. of 3 variables: 
$ df.Amount   : Factor w/ 11837 levels "","-1","-10",..: 2 2 1664 4 6290 6290 6290 6290 6290 6290 ... 
$ as.numeric.df.Amount.: num 2 2 1664 4 6290 ... 
$ as.integer.df.Amount.: int 2 2 1664 4 6290 6290 6290 6290 6290 6290 ... 

> head(df2, 20) 
     df.Amount  as.numeric.df.Amount.  as.integer.df.Amount. 
1    -1       2       2 
2    -1       2       2 
3    -201      1664      1664 
4    -100       4       4 
5    1      6290      6290 
6    1      6290      6290 
7    1      6290      6290 
8    1      6290      6290 
9    1      6290      6290 
10    1      6290      6290 
11    1      6290      6290 
12    1      6290      6290 
13    1      6290      6290 
14    1      6290      6290 
15    1      6290      6290 
16    1      6290      6290 
17    1      6290      6290 
18    2      7520      7520 
19    2      7520      7520 
20    2      7520      7520 

as.numeric और as.integer कार्यों राशि चर ले रहे हैं और इसे करने के लिए कुछ कर रही है, लेकिन मैं नहीं जानता कि यह है कि कर रहे हैं: यह दिखाने के लिए, मैं इस तुलना को एक साथ रखा। मेरा लक्ष्य राशि परिवर्तक को किसी प्रकार के डेटा प्रकार में प्राप्त करना है ताकि मैं उस पर योग/माध्य/आदि कर सकूं।

मैं गलत तरीके से क्या कर रहा हूं जो अजीब संख्याएं पैदा कर रहा है, और मैं इसे ठीक करने के लिए क्या कर सकता हूं?

उत्तर

10

समस्या की जड़ आपके आयातित सीएसवी में कुछ भयानक मूल्य होने की संभावना है। अगर यह एक्सेल से आया, तो यह असामान्य नहीं है। यह एक प्रतिशत प्रतीक, एक्सेल या चीजों की एक लंबी सूची में से एक "टिप्पणी" चरित्र हो सकता है। मैं आपकी पसंद के संपादक में सीएसवी देखता हूं और देख सकता हूं कि आप क्या देख सकते हैं।

इसके अलावा, आपके पास कुछ विकल्प हैं।

read.csv एक वैकल्पिक तर्क stringsAsFactors आप FALSE

करने के लिए सेट कर सकते हैं जो एक कारक पूर्णांक स्तर जो मान मैप के रूप में संग्रहीत किया जाता है लेता है। जब आप as.numeric के साथ सीधे परिवर्तित आप बल्कि प्रारंभिक मान से उन पूर्णांक के स्तर के साथ हवा:

> x<-10:20 
> as.numeric(factor(x)) 
[1] 1 2 3 4 5 6 7 8 9 10 11 
> 

अन्यथा ?factor को देखो:

विशेष रूप से, एक कारक के लिए आवेदन किया as.numeric व्यर्थ है, और अंतर्निहित मजबूती से हो सकता है। एक कारक f को लगभग मूल संख्यात्मक मानों में बदलने के लिए, as.numeric(levels(f))[f] और as.numeric(as.character(f)) से थोड़ा अधिक कुशलता की आवश्यकता है।

हालांकि, मुझे संदेह है कि यह त्रुटि होगी क्योंकि इनपुट में इसके अलावा कुछ भी है।

+0

काफी जल्दी का उपयोग कर 'grep' या' grepl' को विचाराधीन स्तंभ एक चरित्र है, बल्कि कारक से, मैं इस तरह की समस्या का स्रोत खोजने के लिए सक्षम किया गया है कुछ संभावित संदिग्धों की जांच करें। – joran

+0

+1 अच्छा जवाब। मैंने अपमानजनक मूल्यों को कैसे ढूंढें इस पर मेरे उत्तर में थोड़ा सा विस्तार किया ... – Tommy

+0

कचरा .... कुछ बदसूरत कॉमा ने इस मुद्दे को जन्म दिया। सहायता के लिए धन्यवाद। – mikebmassey

10

@ जस्टिन सही है।

# A sample data set with a weird value ("4%") in it 
d <- read.table(text="A B\n1 2\n3 4%\n", header=TRUE) 
str(d) 
#'data.frame': 2 obs. of 2 variables: 
# $ A: int 1 3 
# $ B: Factor w/ 2 levels "2","4%": 1 2 

as.numeric(d$B) # WRONG, returns 1 2 (the internal factor codes) 

# This correctly converts to numeric 
x <- as.numeric(levels(d$B))[d$B] # 2 NA 

# ...and this finds the offending value(s): 
d$B[is.na(x)] # 4% 

# and this finds the offending row numbers: 
which(is.na(x)) # row 2 

नोट यदि आपके डेटा सेट लापता मूल्यों एक खाली सेल या स्ट्रिंग "NA" के अलावा कुछ के रूप में एन्कोड किया गया है, आप के लिए है कि निर्दिष्ट करने के लिए है कि: यहाँ टहलने के माध्यम से है कि कैसे हमलावर मूल्यों को खोजने के लिए पर है read.table:

# Here "N/A" is used instead of "NA"... 
read.table(text="A B\n1 2\n3 N/A\n", header=TRUE, na.strings="N/A") 
1

मैं यहां नया हूं लेकिन मैं अपने प्रश्नों के लिए इस मंच का उपयोग कर रहा हूं।मुझे इसी तरह की समस्या थी लेकिन नीचे मेरे लिए काम किया। मैं डेटा फ्रेम करने के लिए पाठ फ़ाइल से डेटा पोर्टिंग हूँ

data <- read.delim(paste(folderpath,"data.txt",sep=""),header=TRUE,sep="\\",as.is=6) 

ध्यान दें कि मैं कॉलम 6 जो संख्यात्मक डेटा के साथ-साथ कुछ पंक्तियों में कुछ कचरा पात्रों था पर as.is इस्तेमाल किया। As.is को डेटा को स्तंभ 6 में वर्णों के रूप में उपयोग करना बंद कर देता है, फिर निम्नलिखित ने कॉलम 6 में वर्णों को संख्यात्मक मानों में बदल दिया। सभी कचरा मूल्य एनए में परिवर्तित कर दिए गए जिन्हें बाद में हटाया जा सकता था।

data[,6] <- as.numeric(data[,6]) 

आशा इस मदद करता है

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