r لماذا أحصل على X. في أسماء الأعمدة الخاصة بي عند قراءة إطار بيانات؟




dataframe read.csv (4)

طرحت سؤالاً حول هذا الأمر قبل بضعة أشهر ، واعتقدت أن الإجابة قد حلت مشكلتي ، لكنني واجهت المشكلة مرة أخرى ولم ينجح الحل بالنسبة لي.

أستورد ملف CSV:

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

وهنا هيكل من مخطط البيانات:

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 على OrderDate ، فإنها ترجع بشكل صحيح:

length(orders$OrderDate)
[1] 3331575

هذه نسخة / لصق head CSV .

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 خيار check.names ، فإن العمود الأول في dataframe يحتوي الآن على X. في بداية الاسم.

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 إلى X. إلى بداية اسم العمود الأول؟ كما ترى من ملف CSV ، لا توجد أحرف خاصة. يجب أن يكون حمل بسيط. check.names إضافة check.names ، بينما سيتم استيراد الاسم من CSV ، إلى عدم تحميل البيانات لي بشكل صحيح لإجراء التحليل عليها.

ما الذي يمكنني فعله لإصلاح هذا؟

ملاحظة جانبية: إنني أدرك أن هذا أمر ثانوي - أنا أكثر إحباطًا بسبب حقيقة أنني أقوم بالتحميل بشكل صحيح ، ولكن لم أحصل على النتيجة التي كنت أتوقعها. يمكنني إعادة تسمية العمود باستخدام colnames(orders)[1] <- "OrderID" ، ولكن لا تزال تريد معرفة سبب عدم تحميلها بشكل صحيح.


Answer #1

لقد واجهت هذه المشكلة وكان ذلك لسبب بسيط. كان لدي تسميات بدأت برقم ، وكان R يضيف X أمامهم جميعًا. أعتقد أن آر يخلط برقم في الرأس ويطبق حرفًا للتمييز من القيم.

لذلك ، أصبح "3_in" "X3_in" وما إلى ذلك ... لقد حللت عن طريق تبديل التسمية إلى "in_3" وتم حل المشكلات.

آمل أن يساعد هذا شخصًا ما.


Answer #2

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() باستبدالها باسم صالح ، استنادًا إلى الاسم غير make.names() ، وإزالة الأحرف غير الصالحة ومن المحتمل أن يكون make.names() X :

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() في بياناتك. قد يشير ذلك إلى أن لديك تصنيفات غير صحيحة من الناحية التركيبية في صف الرأس في ملف CSV. لاحظ النقطة المذكورة أعلاه من ?make.names أن ما هو حرف يعتمد على لغة النظام الخاص بك؛ قد يتضمن ملف CSV حرفًا صالحًا سيعرضه محرر النص الخاص بك ، ولكن إذا كان R لا يعمل في نفس المنطقة ، فقد لا يكون هذا الحرف صحيحًا ، على سبيل المثال؟

أنظر إلى ملف CSV وحدد أي أحرف غير ASCII في سطر العنوان ؛ هناك ربما أحرف غير مرئية (أو تسلسل الهروب ؛ \t ؟) في صف الرأس أيضا. قد يحدث الكثير بين القراءة في الملف باستخدام الأسماء غير الصالحة وعرضها في وحدة التحكم التي قد تقوم بحجب الأحرف غير الصالحة ، لذلك لا تأخذ حقيقة أنها لا تعرض أي شيء غير صحيح دون check.names تشير إلى أن الملف على ما يرام.

نشر إخراج sessionInfo() قد يكون مفيدًا أيضًا.


Answer #3

لقد حلت مشكلة مماثلة عن طريق تضمين row.names = FALSE كوسيطة في وظيفة write.csv. كان write.csv يتضمن أسماء الصفوف كعمود غير مسمى في ملف CSV وكان read.csv يقوم بتسمية ذلك العمود "X" عندما يقرأ ملف CSV.


Answer #4

ركضت مشكلة مشابهة وأردت مشاركة أسطر التعليمات البرمجية التالية لتصحيح أسماء الأعمدة. بالتأكيد ليست مثالية ، لأن البرمجة النظيفة في الامامية ستكون أفضل ، ولكن ربما تكون مفيدة كنقطة انطلاق لشخص ما كنهج سريع وقذر. (كنت أود أن أضيف لهم كرد على سؤال رايان / سؤال غافينز ، لكن سمعتي ليست عالية بما فيه الكفاية ، لذلك اضطررت إلى نشر إجابة إضافية - آسف).

في حالتي ، أنتجت عدة خطوات من بيانات الكتابة والقراءة عمودًا واحدًا أو أكثر يدعى "X" ، X.1 "، ... يحتوي على محتوى في أرقام X-column و row في X.1 ، ...- الأعمدة. في حالتي ، يجب استخدام محتوى العمود X كأسماء الصفوف والأخرى 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)
}




illegal-characters