r - والمتغيرات - متغير منطقي




لماذا يقوم R بتغيير نوع المتغير عند تحديد قيم نا إلى إطار بيانات مع عوامل؟ (4)

من ?rbind.data.frame ، نقرأ: "ثم يأخذ الطبقات من الأعمدة من إطار البيانات الأولى ...". هذا هو السبب في أنك ترى مسألة الأمر في مكالمتك rbind .

للحصول على الفئات المتغيرة من dat_forward مع ترتيب dat_backward ، هل يمكن فقط بناء dat_forward وإعادة ترتيب الصفوف:

dat_new = rbind(dat, NAs)[c((nrow(dat)+1):(nrow(dat)+nrow(NAs)), 1:nrow(dat)),]
str(dat_new)
# 'data.frame': 20 obs. of  2 variables:
#  $ x: Factor w/ 3 levels "1","2","3": NA NA NA NA NA NA NA NA NA NA ...
#  $ y: num  NA NA NA NA NA NA NA NA NA NA ...

لدي مشكلة في الطريقة R إكراه أنواع متغيرة عند استخدام rbind اثنين من data.frames قيم NA . وأوضح مثالا على ذلك:

x<-factor(sample(1:3,10,T))
y<-rnorm(10)
dat<-data.frame(x,y)
NAs<-data.frame(matrix(NA,ncol=ncol(dat),nrow=nrow(dat)))
colnames(NAs)<-colnames(dat)

الآن الهدف هو إلحاق dat و NAs مع الحفاظ على factor أنواع متغيرة و numeric من x و y . عندما أعطي:

dat_forward<-rbind(dat,NAs)
is.factor(dat_forward$x)

وهذا يعمل بشكل جيد. ومع ذلك فإن الاتجاه المتخلف باستخدام rbind فشل:

dat_backward<-rbind(NAs,dat)
is.factor(dat_backward$x)
is.character(dat_backward$x)

الآن x إكراه إلى مستوى الحرف. أنا الخلط - لا يمكن أن يبقى نوع عامل حتى لو كنت تستخدم النظام الآخر من ملزمة؟ ما هو التغيير المستقبلي في شفرتي للوصول إلى هدفي؟


وإليك طريقة بسيطة إلى حد ما للحصول على فئات العمود الحق:

x <- rbind(dat[1,], NAs, dat)[-1,]
str(x)
#  $ x: Factor w/ 3 levels "1","2","3": NA NA NA NA NA NA NA NA NA NA ...
#  $ y: num  NA NA NA NA NA NA NA NA NA NA ...

بشكل عام، إذا كنت حقا بحاجة إلى هذا في كثير من الأحيان، يمكنك إنشاء وظيفة تشبه rbind الذي يأخذ وسيطة إضافية تشير إلى data.frame إلى الفئات عمود تريد إجبار جميع الأعمدة الآخرين:

myrbind <- function(x, ..., template=x) {
    do.call(rbind, c(list(template[1,]), list(x), list(...)))[-1,]
}

str(myrbind(NAs, dat,  template=dat))
# 'data.frame': 20 obs. of  2 variables:
#  $ x: Factor w/ 3 levels "1","2","3": NA NA NA NA NA NA NA NA NA NA ...
#  $ y: num  NA NA NA NA NA NA NA NA NA NA ...

## If no 'template' argument is supplied, myrbind acts just like rbind    
str(myrbind(dat, NAs))
# 'data.frame': 20 obs. of  2 variables:
#  $ x: Factor w/ 3 levels "1","2","3": 3 3 3 3 2 3 1 1 3 2 ...
#  $ y: num  0.303 1.77 -1.38 1.731 0.033 ...

ويتمثل أحد النهوج في إنشاء NAs مع NAs الأعمدة الصحيحة. ويمكن القيام بذلك بسهولة مع

NAs <- dat[NA,]

يمكنك أيضا جعل العديد من الصفوف كما هو مطلوب مع

num.rows <- 30
NAs <- dat[NA,][1:num.rows,]

data.frame يفعل الكثير من الأشياء بشكل غير صحيح عند rbind 'أنواع مختلفة معا، وخصوصا عندما ينطوي ذلك على عوامل. بدء استخدام data.table (1.8.11+) بدلا من ذلك، وسوف لا يكون لديك هذه القضايا:

library(data.table)
dt1 = data.table(dat)
dt2 = data.table(NAs)

sapply(rbind(dt1, dt2), class)
#        x         y 
# "factor" "numeric" 
sapply(rbind(dt2, dt1), class)
#        x         y 
# "factor" "numeric" 




r-factor