2015-12-01 9 views
5

के साथ Rdata फ़ाइल पढ़ना मेरे पास मेरी लिनक्स (यूटीएफ -8) मशीन पर पढ़ने के लिए एक .डेटा फ़ाइल है, लेकिन मुझे पता है कि फ़ाइल लैटिन 1 में है क्योंकि मैंने उन्हें विंडोज़ पर बनाया है। दुर्भाग्यवश, मेरे पास मूल फ़ाइलों या विंडोज मशीन तक पहुंच नहीं है और मुझे उन फ़ाइलों को मेरी लिनक्स मशीन पर पढ़ने की जरूरत है।विभिन्न एन्कोडिंग

एक Rdata फ़ाइल पढ़ने के लिए, सामान्य प्रक्रिया load("file.Rdata") चलाने के लिए है। read.csv जैसे कार्यों में encoding तर्क है जिसका उपयोग आप उन समस्याओं को हल करने के लिए कर सकते हैं, लेकिन load ऐसी कोई बात नहीं है।

Error in load("file.Rdata", encoding = "latin1") : unused argument (encoding = "latin1")

मैं और क्या कर सकते हैं: अगर मैं load("file.Rdata", encoding = latin1) कोशिश, मैं सिर्फ यह (उम्मीद) त्रुटि मिलती है? मेरी फाइलों को टेक्स्ट वैरिएबल के साथ लोड किया गया है जिसमें यूटीएफ -8 वातावरण में खोले जाने पर दूषित हो जाते हैं।

+2

RData फ़ाइलों में एन्कोडिंग नहीं है। आपको क्रमबद्ध Rdata लोड करने की आवश्यकता है और फिर R वर्कस्पेस के अंदर होने के बाद मानों को फिर से एन्कोड करना होगा। यदि यह 'एन्कोडिंग' पढ़ने के बाद अस्पष्ट रहता है, तो लोड करें और 'dput (head (ऑब्जेक्ट)) के आउटपुट को पोस्ट करें। –

+0

@ 42, इस समस्या को हल करने के लिए, बहुत बुरा जाहिरा तौर पर मैं अपने dataframe में प्रत्येक वेक्टर के लिए लागू करने के लिए 'एन्कोडिंग (एक्स)' की जरूरत है लगता है। मैं इसे बेहतर तरीके से देखूंगा और आपसे वापस आऊंगा। –

+0

आप भार से पहले और बाद में वर्कस्पेस में नाम रिकॉर्ड कर सकते हैं और उसके बाद वर्णों वाले मानों के लिए अंतर पर काम कर सकते हैं। –

उत्तर

3

42 की टिप्पणी के लिए धन्यवाद, मैं फ़ाइल पुनःकूटित करना एक समारोह लिखने के लिए प्रबंधित किया है:

fix.encoding <- function(df, originalEncoding = "latin1") { 
    numCols <- ncol(df) 
    for (col in 1:numCols) Encoding(df[, col]) <- originalEncoding 
    return(df) 
} 

मांस यहाँ आदेश Encoding(df[, col]) <- "latin1", जो dataframe df के स्तंभ col लेता है और यह धर्मान्तरित प्रारूप latin1 है । दुर्भाग्य से, Encoding केवल इनपुट के रूप में कॉलम ऑब्जेक्ट्स लेता है, इसलिए मुझे डेटाफ्रेम ऑब्जेक्ट के सभी कॉलम साफ़ करने और परिवर्तन लागू करने के लिए एक फ़ंक्शन बनाना पड़ा।

बेशक, यदि आपकी समस्या केवल कुछ कॉलम में है, तो आप पूरे डेटाफ्रेम के बजाय Encoding को उन कॉलम पर लागू करने से बेहतर हैं (आप इनपुट के रूप में कॉलम का एक सेट लेने के लिए ऊपर दिए गए फ़ंक्शन को संशोधित कर सकते हैं)। इसके अलावा, यदि आप उलटी समस्या का सामना कर रहे हैं, यानी विंडोज़ में लिनक्स या मैक ओएस में बनाए गए आर ऑब्जेक्ट को पढ़ना, तो आपको originalEncoding = "UTF-8" का उपयोग करना चाहिए।

1

इसे पोस्ट करने के लिए धन्यवाद। यदि आपके पास चरित्र के रूप में कुछ कॉलम और कुछ गैर-वर्ण के रूप में डेटाफ्रेम है, तो मैंने आपके फ़ंक्शन को संशोधित करने की स्वतंत्रता ली है। अन्यथा, एक त्रुटि होती है:

fix.encoding <- function(df, originalEncoding = "latin1") { 
    numCols <- ncol(df) 
    for (col in 1:numCols) 
      if(class(df[, col]) == "character"){ 
        Encoding(df[, col]) <- originalEncoding 
      } 
    return(df) 
} 

बहरहाल, यह एक "कारक" कॉलम में स्तर के नाम के एन्कोडिंग नहीं बदलेगा:

> fix.encoding(adress) 
Error in `Encoding<-`(`*tmp*`, value = "latin1") : 
a character vector argument expected 

तो यहाँ संशोधित कार्य है। सौभाग्य से, मैं इस चरित्र के लिए अपनी dataframe में सभी कारक बदलने के लिए मिल गया है (जो सबसे अच्छा तरीका नहीं हो सकता है, लेकिन मेरे मामले में है कि मैं क्या जरूरत है):

i <- sapply(df, is.factor) 
df[i] <- lapply(df[i], as.character) 
1

पिछले उत्तरों के निम्नलिखित, यह एक बहुत ही कम हो अद्यतन जो इसे कारकों और dplyr के tibble पर काम करता है। प्रेरणा के लिए धन्यवाद।

fix.encoding <- function(df, originalEncoding = "UTF-8") { 
numCols <- ncol(df) 
df <- data.frame(df) 
for (col in 1:numCols) 
{ 
     if(class(df[, col]) == "character"){ 
       Encoding(df[, col]) <- originalEncoding 
     } 

     if(class(df[, col]) == "factor"){ 
         Encoding(levels(df[, col])) <- originalEncoding 
} 
} 
return(as_data_frame(df)) 
} 
संबंधित मुद्दे