أكثر

تغيير قيم حساب البيانات النقطية - تقصير هذا البرنامج النصي؟

تغيير قيم حساب البيانات النقطية - تقصير هذا البرنامج النصي؟


أفعل شيئًا واضحًا تمامًا فيما يتعلق بالجبر النقطي ولكني أجد صعوبة في العثور على الوظيفة الصحيحة أو جعل الدالة تعمل بشكل صحيح ؛

لدي أساسًا نقطتان ، يمثلان سنوات متتالية ، ويمثلان تصنيفًا (بما في ذلك قيم زمالة المدمنين المجهولين) ؛

r <- نقطية (ncol = 10 ، nrow = 10) r [] <- عينة (c (1،2،4،8) ، الحجم = 100 ، استبدال = T) r [runif (10 * 10)> = 0.50 ] <- NA r1 <- النقطية (ncol = 10، nrow = 10) r1 [] <- sample (c (1،2،4،8)، size = 100، replace = T) r1 [runif (10 * 10 )> = 0.50] <- NA

للحصول على التغيير الخاص بي من سنة (ص) إلى أخرى (r1) ، أقوم ببساطة بطرح r1 من r ؛

r2 = r - r1 التكرار (r2 ، الأرقام = 2)

كل رموز عدد صحيح جديد لتغيير معين ، 0 يعني ببساطة عدم وجود تغيير. لا مانع من أن تصبح الخلايا NA إذا كان NA موجودًا فقط في طبقة نقطية واحدة ، فلا بأس بذلك. ما أريد فعله هو فحص قيم 0 عن كثب ، لذا إذا كانت القيمة الأصلية في r هي 1 والقيمة الأخيرة في r1 هي أيضًا 1 ، فأنا أريد أن أعرف هذا في r2 الناتج - أي quanitfy وتحليل "لا" تغيير "الخلايا. نفس الشيء بالنسبة لـ r = 2 & r1 = 2 ، r = 4 & r1 = 4 وما إلى ذلك - ليس فقط كل الأصفار ولكن كمجموعة من الرموز الجديدة غير المستخدمة لتمثيل الخلايا التي بقيت كما هي (وكيف بقيت كما هي) من واحدة من عام إلى آخر.

في الأساس ، قمت باستخراج موضع الخلايا من r2 الذي يساوي 0 كإطار بيانات النقاط المكانية ؛

نقاط <-rasterToPoints (r2، fun = function (x) {x == 0}، spatial = T) مؤامرة (نقاط)

ثم قمت باستبدال الخلايا في r2 التي تساوي 0 بقيم من r (أو r1 ، لا يهم لأنها نفس القيمة) باستخدام المواقع المشتقة أعلاه ؛

r2 [r2 == 0] <- (استخراج (ص ، نقاط)) / 10 قطعة أرض (r2) التكرار (r2 ، أرقام = 2)

تضمن قسمة قيم الاستبدال على 10 أنها لا تقع في نفس "الحاوية" مثل أي تغيير رمز معيّن آخر.

أنا متأكد من أن هناك طريقة أسرع؟ اعتقدت أنني سأكون قادرًا على إنشاء مكدس نقطي من r و r1 ، وإنشاء r2 ، ثم استخدام نوع من وظيفة "أين" أو "ifelse" لإجراء العمليات الحسابية أعلاه ، ولكن كل ما أفعله ينتج عنه أخطاء أو إهمال من قيم زمالة المدمنين المجهولين لجعل الوظائف تعمل. أو أخطاء S4 / عدد صحيح.

ما زلت غير متأكد من أن هذا سيعمل على عينة كبيرة حتى الآن ، ومجموعات البيانات النهائية الخاصة بي ضخمة جدًا.


ما تريده هو حساب شرطي: إرجاع قيمةصكلما كانصوr1متساوية وتعيين الإخراج بطريقة أخرى إلى NA.

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

  1. تعامل مع المنطق كأرقام.خاطئةهو 0 وحقيقيةهي 1 في العمليات الحسابية.

  2. قم بإنشاء قيم زمالة المدمنين المجهولين (أو قيم غير محدودة تقريبًا بنفس الفعالية) باستخدام عمليات حسابية غير صالحة.

حل واحد هو

r3 <- r == r1 r3 <- r3 * r * (1 / r3)

إنه يعمل لأنه متىصوr1كلاهما متساويانr3و1 / ص 3يساوي 1 والمضاعفات لا تغير شيئًا: إنها ترجع قيمةص. متيصوr1لا تتساوى1 / ص 3غير محدد ، ينتج عنه نتيجة لا نهائية. نتيجة ل،التكراريقوم بجدولة قيم الخلايا فقط حيثصوr1يوافق على.

تستغرق هذه العملية الحسابية على جهازي حوالي ثانية واحدة للنقطيات التي تحتوي على 10000000 خلية. (إنها حوالي عشرة أضعاف طول المقارنة البسيطةص - r1.) سوف يتناسب بشكل مباشر مع عدد الخلايا حتى يتم استدعاء استدعاء القرص ، وعند هذه النقطة ستكون تحت رحمة سعة التخزين الخاصة بك.

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


نظرًا لأن Whuber أعطاني قطعة كود سريعة لطيفة لإنشاء خطوط نقطية بالقيم نفسها بين البيانات النقطية ، فقد اعتقدت أنني سأنتهي من المهمة بأكملها ؛

إنشاء نقطية وطرح واحدة من الأخرى للحصول على نقطية "تغيير" (مليئة بالأصفار التي تحتاج إلى فحص أيضًا) ؛

r <- نقطية (ncol = 10 ، nrow = 10) r [] <- عينة (c (1،2،4،8) ، الحجم = 100 ، استبدال = T) r [runif (10 * 10)> = 0.50 ] <- NA r1 <- نقطية (ncol = 10، nrow = 10) r1 [] <- sample (c (1،2،4،8)، size = 100، replace = T) r1 [runif (10 * 10 )> = 0.50] <- NA r2 = r - r1

ثم ، باستخدام جزء صغير من التعليمات البرمجية الخاصة بـ whuber ، قم بإنشاء خطوط نقطية جديدة حيث تكون القيم هي نفسها (قسمة على 10 بحيث لا تتطابق قيم الخلية مع أي شيء تم حسابه مسبقًا) ؛

r0 <- r == r1 r0 <- (r0 * r * (1 / r0)) / 10

لدمج البيانات النقطية الأصلية مع البيانات النقطية الجديدة التي تحلل الخلايا التي لا تحتوي على تغيير ، قم بإضافتها معًا ، وقم أولاً بتغيير قيم NA إلى 0 ؛

r0 [is.na (r0)] <- 0 rfinal <- r2 + r0

التي تنشئ بيانات نقطية جديدة مع جميع التغييرات وجميع القيم الصفرية التي تم تغييرها إلى رمز معين لفحص نوع "عدم التغيير" الذي يحدث بالضبط.

تصدير إلى ملف csv ؛

الأعداد <- التكرار (rfinal، digits = 2، useNA = 'no') write.csv (counts، "counts.csv")

شاهد الفيديو: 71 تعديل قيم ثابتة من جدول البيانات الوصفية باستخدام الامر replace