الطريقة الصحيحة لتحويل data.frame إلى مصفوفة رقمية ، عندما df يحتوي أيضا على سلاسل؟




if-statement matrix (4)

تحرير 2: انظر @ الإجابة flodel. أفضل بكثير.

محاولة:

# assuming SFI is your data.frame
as.matrix(sapply(SFI, as.numeric))  

تعديل: أو كما اقترح @ CarlWitthoft في التعليقات:

matrix(as.numeric(unlist(SFI)),nrow=nrow(SFI))

لدي إطار بيانات مأخوذ من ملف .csv يحتوي على قيم رقمية وحروف. أرغب في تحويل إطار البيانات هذا إلى مصفوفة. كل المعلومات التي تحتوي عليها هي أرقام (الصفوف غير التي أحذفها) ، لذا ينبغي أن يكون بالإمكان تحويل إطار البيانات إلى مصفوفة رقمية. ومع ذلك ، يمكنني الحصول على مصفوفة حرف.

لقد وجدت أن الطريقة الوحيدة لحل هذه المشكلة هي استخدام as.numeric لكل صف ، ولكن هذا يستغرق وقتًا طويلاً. أنا متأكد تماما أن هناك طريقة للقيام بذلك مع نوع من if(i in 1:n) ، ولكن لا أستطيع معرفة كيف يمكن أن تعمل. أو هي الطريقة الوحيدة بالفعل للبدء بالفعل بالقيم الرقمية ، مثل المقترحة هنا (إنشاء المصفوفة الرقمية وأوامر الأسماء

ربما هذا شيء سهل للغاية بالنسبة لمعظمكم: P

المصفوفة أكبر بكثير ، هذه ليست سوى الصفوف القليلة الأولى ... وإليك الكود:

cbind(
as.numeric(SFI.Matrix[ ,1]),
as.numeric(SFI.Matrix[ ,2]),
as.numeric(SFI.Matrix[ ,3]),
as.numeric(SFI.Matrix[ ,4]),
as.numeric(SFI.Matrix[ ,5]),
as.numeric(SFI.Matrix[ ,6]))  

# to get something like this again:

Social.Assistance Danger.Poverty GINI S80S20 Low.Edu        Unemployment 
0.147             0.125          0.34    5.5   0.149        0.135 0.18683691
0.258             0.229          0.27    3.8   0.211        0.175 0.22329362
0.207             0.119          0.22    3.1   0.139        0.163 0.07170422
0.219             0.166          0.25    3.6   0.114        0.163 0.03638525
0.278             0.218          0.29    4.1   0.270        0.198 0.27407825
0.288             0.204          0.26    3.6   0.303        0.211 0.22372633

شكرا لك على أي مساعدة!


لقد ملأت NAs يدويًا من خلال تصدير ملف CSV ثم تحريره وإعادة تقديمه ، كما هو موضح أدناه.

ربما يشرح أحدكم الخبراء سبب نجاح هذا الإجراء (كان الملف الأول يحتوي على أعمدة تحتوي على بيانات من أنواع char و INT و num (أرقام النقاط العائمة)) ، والتي أصبحت جميعها نوع char بعد الخطوة 1 ؛ ولكن في نهاية الخطوة 3 R التعرف على نوع البيانات من كل عمود بشكل صحيح.

# STEP 1:
MainOptionFile <- read.csv("XLUopt_XLUstk_v3.csv",
                            header=T, stringsAsFactors=FALSE)
#... STEP 2:
TestFrame <- subset(MainOptionFile, str_locate(option_symbol,"120616P00034000") > 0)
write.csv(TestFrame, file = "TestFrame2.csv")
# ...
# STEP 3:
# I made various amendments to `TestFrame2.csv`, including replacing all missing data cells with appropriate numbers. I then read that amended data frame back into R as follows:    
XLU_34P_16Jun12 <- read.csv("TestFrame2_v2.csv",
                            header=T,stringsAsFactors=FALSE)

لدى الوصول إلى R ، كانت جميع الأعمدة بها مستويات قياس صحيحة تم التعرف عليها تلقائيًا من R!


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

apply(as.matrix.noquote(SFI),2,as.numeric)

ولكن الطريقة الأكثر موثوقية لتحويل إطار البيانات إلى مصفوفة هي استخدام data.matrix() .


هناك طريقة أخرى للقيام بذلك عن طريق استخدام colText () read.table () لتحديد نوع العمود بجعل colClasses = c ( أنواع فئات الأعمدة ). إذا كان هناك 6 أعمدة تريد أعضاءها كعدد ، تحتاج إلى تكرار سلسلة الأحرف "رقمية" ست مرات مفصولة بفواصل ، واستيراد إطار البيانات ، و as.matrix () إطار البيانات. PS يبدو أن لديك رؤوس ، لذلك أضع رأس = T.

as.matrix(read.table(SFI.matrix,header=T,
colClasses=c("numeric","numeric","numeric","numeric","numeric","numeric"),
sep=","))