مستويات عامل غير مرئي عند إلحاق سجلات جديدة بقيم سلسلة غير مرئية إلى dataframe ، تتسبب في حدوث التحذير والنتيجة في NA




append r-factor (5)

1) إنشاء إطار البيانات مع stringsAsFactor لتعيين FALSE. هذا يجب أن يحل مشكلة العامل

2) بعد ذلك لا تستخدم rbind - تفسد أسماء الأعمدة إذا كان إطار البيانات فارغًا. ببساطة تفعل ذلك بهذه الطريقة:

df[nrow(df)+1,] <- c("d","gsgsgd",4)

/

> df <- data.frame(a = character(0), b=character(0), c=numeric(0))

> df[nrow(df)+1,] <- c("d","gsgsgd",4)

Warnmeldungen:
1: In `[<-.factor`(`*tmp*`, iseq, value = "d") :
  invalid factor level, NAs generated
2: In `[<-.factor`(`*tmp*`, iseq, value = "gsgsgd") :
  invalid factor level, NAs generated

> df <- data.frame(a = character(0), b=character(0), c=numeric(0), stringsAsFactors=F)

> df[nrow(df)+1,] <- c("d","gsgsgd",4)

> df
  a      b c
1 d gsgsgd 4

لديّ dataframe كبير (14552 صفًا في 15 عمودًا) يحتوي على بيانات الفوترة من 2001 إلى 2007. لقد استخدمت sqlFetch للحصول على بيانات عام 2008. من أجل إلحاق بيانات عام 2008 ببيانات السنوات السبع السابقة ، يمكن القيام بما يلي

alltime <- rbind(alltime,all2008)

لسوء الحظ هذا يولد

رسالة التحذير: في [<-.factor ( *tmp* ، ri، value = c (NA، NA، NA، NA، NA، NA، NA،: invalid factor factor، NAs generated

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

إن الطريقة التي تستورد بها R البيانات وتعمل تلقائيًا على ما هو رقمي وما هو غير (وبالتالي يجعله عاملًا) هي رائعة - حتى تتمكن من التلاعب بها ومن ثم تصبح ألمًا. كيف أتغلب على مشكلتي بأناقة؟


الطريقة "السهلة" هي ببساطة عدم تعيين السلاسل الخاصة بك كعوامل عند استيراد بيانات النص.

لاحظ أن دالات read.{table,csv,...} تأخذ معلمة stringsAsFactors ، والتي يتم تعيينها افتراضيًا إلى TRUE . يمكنك تعيين هذا على FALSE أثناء قيامك باستيراد rbind و rbind .

إذا كنت ترغب في تعيين العمود ليكون عاملاً في النهاية ، فيمكنك فعل ذلك أيضًا.

فمثلا:

alltime <- read.table("alltime.txt", stringsAsFactors=FALSE)
all2008 <- read.table("all2008.txt", stringsAsFactors=FALSE)
alltime <- rbind(alltime, all2008)
# If you want the doctor column to be a factor, make it so:
alltime$doctor <- as.factor(alltime$doctor)

كما هو مقترح في الإجابة السابقة ، اقرأ الأعمدة كحرف وقم بإجراء التحويل إلى عوامل بعد rbind . SQLFetch (أفترض RODBC ) أيضاً stringsAsFactors أو الوسيطة as.is للتحكم في تحويل الأحرف. القيم المسموح بها هي مثل read.table ، على سبيل المثال ، as.is=TRUE أو بعض رقم العمود.


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

rbindCommonCols <-function (x، y) {

commonColNames = intersect(colnames(x), colnames(y))
x = x[,commonColNames]
y = y[,commonColNames]

colClassesX = sapply(x, class)
colClassesY = sapply(y, class)
classMatch = paste( colClassesX, colClassesY, sep = "-" )
factorColIdx = grep("factor", classMatch)

for(n in factorColIdx){ 
    x[,n] = as.factor(x[,n])
    y[,n] = as.factor(y[,n])
}

for(n in factorColIdx){ 
    x[,n] = factor(x[,n], levels = unique(c( levels(x[,n]), levels(y[,n]) )))
    y[,n] = factor(y[,n], levels = unique(c( levels(y[,n]), levels(x[,n]) )))  
} 

res = rbind(x,y)
res

}


يمكن أن يكون بسبب عدم تطابق أنواع في اثنين من data.frames .

أولا وقبل كل أنواع الاختيار (الفئات). لأغراض التشخيص القيام بذلك:

new2old <- rbind( alltime, all2008 ) # this gives you a warning
old2new <- rbind( all2008, alltime ) # this should be without warning

cbind(
    alltime = sapply( alltime, class),
    all2008 = sapply( all2008, class),
    new2old = sapply( new2old, class),
    old2new = sapply( old2new, class)
)

أتوقع أن يكون هناك صف يبدو كالتالي:

            alltime  all2008   new2old  old2new
...         ...      ...       ...      ...
some_column "factor" "numeric" "factor" "character"
...         ...      ...       ...      ...

إذا كان الأمر كذلك ، rbind : rbind لا يتحقق من مطابقة الأنواع. إذا قمت بتحليل رمز rbind.data.frame ثم يمكنك أن ترى أن الوسيطة الأولى تهيئة أنواع المخرجات. إذا كان نوع data.frame الأول هو عامل ، فسيكون عمود data.frame الناتج عاملاً ذا مستويات unique(c(levels(x1),levels(x2))) . ولكن عندما يكون العمود data.frame الثاني ليس عاملاً ، تكون levels(x2) هي NULL ، لذلك لا تمتد المستويات.

وهذا يعني أن بيانات الإخراج الخاصة بك خاطئة! هناك NA بدلا من القيم الحقيقية

أفترض أن:

  1. يمكنك إنشاء بيانات قديمة باستخدام إصدار R / RODBC آخر بحيث تم إنشاء أنواع بطرق مختلفة (إعدادات مختلفة - فاصل عشري ربما)
  2. هناك NULL أو بعض البيانات المحددة في العمود إشكالية ، على سبيل المثال. شخص ما تغيير العمود تحت قاعدة البيانات.

حل:

العثور على عمود خاطئ وإيجاد سبب لخطأها وثابتة. القضاء على السبب لا الأعراض.





levels