مكونات - التعامل مع أنواع الحقول في تفاعل قاعدة البيانات مع R




مكونات قاعدة البيانات access (2)

حسنا، حصلت على حل عملي الآن. وهنا وظيفة التي خرائط أنواع حقول ميسكل إلى فئات R. يساعد هذا في التعامل مع تاريخ نوع حقل ميسكل ...

dbReadMap <- function(con,table){
    statement <- paste("DESCRIBE ",table,sep="")
    desc <- dbGetQuery(con=con,statement)[,1:2]

  # strip row_names if exists because it's an attribute and not real column
  # otherweise it causes problems with the row count if the table has a row_names col
  if(length(grep(pattern="row_names",x=desc)) != 0){
  x <- grep(pattern="row_names",x=desc)
  desc <- desc[-x,]
  }



    # replace length output in brackets that is returned by describe
    desc[,2] <- gsub("[^a-z]","",desc[,2])

    # building a dictionary 
    fieldtypes <- c("int","tinyint","bigint","float","double","date","character","varchar","text")
    rclasses <- c("as.numeric","as.numeric","as.numeric","as.numeric","as.numeric","as.Date","as.character","as.character","as.character") 
    fieldtype_to_rclass = cbind(fieldtypes,rclasses)

    map <- merge(fieldtype_to_rclass,desc,by.x="fieldtypes",by.y="Type")
    map$rclasses <- as.character(map$rclasses)
    #get data
    res <- dbReadTable(con=con,table)



    i=1
    for(i in 1:length(map$rclasses)) {
        cvn <- call(map$rclasses[i],res[,map$Field[i]])
        res[map$Field[i]] <- eval(cvn)
    }


    return(res)
}

ربما هذا ليس ممارسة البرمجة جيدة - أنا فقط لا أعرف أي أفضل. لذلك، واستخدامها على مسؤوليتك الخاصة أو مساعدتي على تحسينه ... وبالطبع انها فقط نصف منه: reading . نأمل أن تجد بعض الوقت لكتابة وظيفة الكتابة قريبا.

إذا كان لديك اقتراحات لرسم الخرائط قاموس اسمحوا لي أن أعرف :)

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

معظم الوقت يمكنني استخدام وظائف الراحة مثل dbWriteTable و dbReadTable لكتابة وقراءة البيانات الخاصة بي. للأسف هذه هي تماما تماما تجاهل أنواع البيانات R وأنواع الحقول ميسكل. أعني أنني أتوقع أن تنتهي حقول تاريخ الخلية في فئة Date أو POSIX . الطريقة الأخرى حول I'd أعتقد أن يتم تخزين هذه الفئات R كنوع الحقل ميسكل المقابلة إلى حد ما. وهذا يعني أن التاريخ لا ينبغي أن يكون حرفا - أنا لا أتوقع أن نميز بين تعويم وزوجي هنا ...

حاولت أيضا استخدام dbGetQuery - نفس النتيجة هناك. هل هناك شيء لقد غاب تماما عند قراءة الدليل أو أنه ببساطة لا يمكن (حتى الآن) في هذه الحزم؟ ماذا من خلال العمل الجميل حولها؟

إديت:mdsummer حاولت العثور على شيء أكثر في الوثائق، ولكن وجدت فقط هذه خطوط مخيبة للآمال: `يتم قراءة جداول ميسكل إلى R كما data.frames، ولكن من دون إكراه الطابع أو البيانات المنطقية إلى عوامل. وبالمثل أثناء تصدير البيانات، إطارات، يتم تصدير العوامل باعتبارها ناقلات الأحرف.

وعادة ما يتم استيراد الأعمدة الصحيحة كنواقل R الصحيحة، باستثناء حالات مثل بيجينت أو أونسيغند إنتيغر التي يتم إجبارها على ناقلات الدقة المزدوجة R لتجنب اقتطاع (يتم حاليا توقيع أرقام R الصحيحة كميات 32 بت).

يتم استيراد / تصدير متغيرات الوقت كبيانات حرف، لذلك تحتاج إلى تحويل هذه إلى التاريخ المفضل لديك / الوقت التمثيل.


هنا هو وظيفة أكثر عامة من وظيفة @ Matt Bannert التي تعمل مع الاستعلامات بدلا من الجداول:

# Extension to dbGetQuery2 that understands MySQL data types
dbGetQuery2 <- function(con,query){
    statement <- paste0("CREATE TEMPORARY TABLE `temp` ", query)
    dbSendQuery(con, statement)
    desc <- dbGetQuery(con, "DESCRIBE `temp`")[,1:2]
    dbSendQuery(con, "DROP TABLE `temp`")

    # strip row_names if exists because it's an attribute and not real column
    # otherweise it causes problems with the row count if the table has a row_names col
    if(length(grep(pattern="row_names",x=desc)) != 0){
        x <- grep(pattern="row_names",x=desc)
        desc <- desc[-x,]
    }

    # replace length output in brackets that is returned by describe
    desc[,2] <- gsub("[^a-z]","",desc[,2])

    # building a dictionary 
    fieldtypes <- c("int",        "tinyint",    "bigint",     "float",      "double",     "date",    "character",    "varchar",   "text")
    rclasses <-   c("as.numeric", "as.numeric", "as.numeric", "as.numeric", "as.numeric", "as.Date", "as.character", "as.factor", "as.character") 
    fieldtype_to_rclass = cbind(fieldtypes,rclasses)

    map <- merge(fieldtype_to_rclass,desc,by.x="fieldtypes",by.y="Type")
    map$rclasses <- as.character(map$rclasses)
    #get data
    res <- dbGetQuery(con,query)

    i=1
    for(i in 1:length(map$rclasses)) {
        cvn <- call(map$rclasses[i],res[,map$Field[i]])
        res[map$Field[i]] <- eval(cvn)
    }

    return(res)
}




rmysql