r - تسلسل صفوف لإطار البيانات




vector concatenation (3)

إذا كنت تريد أن تبدأ

df <- data.frame(letters = LETTERS[1:5], numbers = 1:5, stringsAsFactors=TRUE)

.. ثم لا توجد قاعدة عامة حول كيفية تفسير df$letters بأي وظيفة معينة. انها عامل لوظائف النمذجة ، شخصية لبعض وأرقام صحيحة لبعض الآخرين. حتى الوظيفة نفسها مثل اللصق قد تفسرها بشكل مختلف ، اعتمادًا على كيفية استخدامها:

paste(df[1,], collapse="") # "11"
apply(df, 1, paste, collapse="") # "A1" "B2" "C3" "D4" "E5"

لا منطق في ذلك إلا أنه من المحتمل أن يكون له معنى بمجرد معرفة الداخلية لكل وظيفة.

يبدو أن العوامل يتم تحويلها إلى أعداد صحيحة عندما يتم تحويل الوسيطة إلى متجه (كما تعلم ، فإن إطارات البيانات عبارة عن قوائم للمتجهات ذات الطول المتساوي ، لذا فإن الصف الأول لإطار البيانات هو أيضًا قائمة ، وعندما يتم إجبارها على ناقل ، شيء من هذا القبيل يحدث :)

df[1,]
#    letters numbers
# 1       A       1
unlist(df[1,])
# letters numbers 
#  1       1 

لا أعرف كيف يحقق apply ما يفعله (بمعنى أنه يتم تمثيل العوامل بقيم الأحرف) - إذا كنت مهتمًا ، انظر إلى شفرة المصدر الخاصة به. قد يكون من المفيد أن تعرف ، مع ذلك ، أنه يمكنك الوثوق (بهذا المعنى الخاص) apply (في هذه المناسبة المحددة). بشكل عام ، من المفيد تخزين كل جزء من البيانات بتنسيق معقول ، يتضمن تخزين السلاسل كسلسلة ، بمعنى استخدام stringsAsFactors=FALSE .

راجع للشغل ، يجب أن يكون كل كتاب R التمهيدية هذه الفكرة في العنوان الفرعي. على سبيل المثال ، خطتي للتقاعد هي أن أكتب "A (not not) مقدمة لطيفة ل zen من مصايد البيانات مع R ، the stringsAsFactors = FALSE way".

أرغب في أخذ إطار بيانات يحتوي على أحرف وأرقام ، وسَلسَلة جميع عناصر كل صف في سلسلة واحدة ، والتي سيتم تخزينها كعنصر واحد في المتجه. على سبيل المثال ، أقوم بإعداد إطار بيانات للحروف والأرقام ، ثم أرغب في تسلسل الصف الأول عبر وظيفة اللصق ، ونأمل أن نعيد القيمة "A1"

df <- data.frame(letters = LETTERS[1:5], numbers = 1:5)
df

##   letters numbers
## 1       A       1
## 2       B       2
## 3       C       3
## 4       D       4
## 5       E       5

paste(df[1,], sep =".")
## [1] "1" "1"

لذا فإن اللصق يقوم بتحويل كل عنصر من الصف إلى عدد صحيح يتوافق مع "فهرس المستوى المقابل" كما لو كان عاملاً ، ويحافظ على متجه طوله اثنين. (أعلم / أعتقد أن العوامل التي يتم إكراهها على أن تكون أحرف تتصرف بهذه الطريقة ، ولكن R لا تخزن df [1 ،] كعامل على الإطلاق (تم اختباره بواسطة is.factor () ، لا يمكنني التحقق من أنه هو في الواقع مؤشر لمستوى)

is.factor(df[1,])
## [1] FALSE
is.vector(df[1,])
## [1] FALSE

لذلك إذا لم يكن متجهًا ، فمن المنطقي أن يتصرف بشكل غريب ، ولكن لا يمكنني إكراهه في ناقلات

> is.vector(as.vector(df[1,]))
[1] FALSE

استخدام as.character لا يبدو أنه يساعد في محاولاتي

يمكن لأي شخص أن يفسر هذا السلوك؟


بالنسبة لأولئك الذين يستخدمون المكتبة (tidyverse) ، يمكنك ببساطة استخدام وظيفة التوحيد.

 new.df<-df%>%
 unite(together, letters, numbers, sep="")

هذا سوف يعطيك عمود جديد يسمى "معا" مع A1 ، B2 ، الخ


هذا في الواقع غريب بعض الشيء ، ولكن هذا هو ما يفترض أن يحدث. عند إنشاء data.frame كما فعلت ، يتم تخزين letters العمود factor . بطبيعة الحال ليس للعوامل أي طلب ، وبالتالي عندما يتم تطبيق as.numeric() على عامل ، فإنها ترجع ترتيب العامل. فمثلا:

> df[, 1]
[1] A B C D E
Levels: A B C D E
> as.numeric(df[, 1])
[1] 1 2 3 4 5

A هو المستوى الأول من العامل df[, 1] لذلك يتم تحويل A إلى القيمة 1 ، عندما يتم تطبيق as.numeric . هذا ما يحدث عند استدعاء paste(df[1, ]) . نظرًا لأن الأعمدة 1 و 2 من فئة مختلفة ، فإن اللصق أولاً يحول كلا العنصرين من الصف الأول إلى رقمي ثم إلى أحرف.

عندما ترغب في تسلسل كلا العمودين ، يجب أولاً تحويل الصف الأول إلى الحرف:

df[, 1] <- as.character(df[, 1])
paste(df[1,], collapse = "")

كما أشار sebastian-c @ ، يمكنك أيضًا استخدام stringsAsFactors = FALSE في إنشاء data.frame ، ثم يمكنك حذف الخطوة as.character() .





r-factor