إنشاء (والوصول إلى) مصفوفة متفرقة مع إدخالات NA الافتراضية
-
16-09-2019 - |
سؤال
بعد التعلم عن خيارات للعمل مع مصفوفات متفرقة في ص, أريد أن أستخدم مصفوفة حزمة لإنشاء مصفوفة متفرقة من إطار البيانات التالي ولدي كل العناصر الأخرى NA
.
s r d
1 1089 3772 1
2 1109 190 1
3 1109 2460 1
4 1109 3071 2
5 1109 3618 1
6 1109 38 7
أعلم أنني أستطيع إنشاء مصفوفة متناثرة مع ما يلي، والوصول إلى عناصر كالمعتاد:
> library(Matrix)
> Y <- sparseMatrix(s,r,x=d)
> Y[1089,3772]
[1] 1
> Y[1,1]
[1] 0
ولكن إذا كنت ترغب في الحصول على القيمة الافتراضية لتكون NA، جربت ما يلي:
M <- Matrix(NA,max(s),max(r),sparse=TRUE)
for (i in 1:nrow(X))
M[s[i],r[i]] <- d[i]
وحصلت على هذا الخطأ
Error in checkSlotAssignment(object, name, value) :
assignment of an object of class "numeric" is not valid for slot "x" in an object of class "lgCMatrix"; is(value, "logical") is not TRUE
ليس ذلك فحسب، أجد أن المرء يستغرق الوصول إلى العناصر.
> system.time(Y[3,3])
user system elapsed
0.000 0.000 0.003
> system.time(M[3,3])
user system elapsed
0.660 0.032 0.995
كيف يجب أن أقوم بإنشاء هذه المصفوفة؟ لماذا مصفوفة واحدة أبطأ كثيرا للعمل معها؟
إليك مقتطف التعليمات البرمجية للبيانات أعلاه:
X <- structure(list(s = c(1089, 1109, 1109, 1109, 1109, 1109), r = c(3772,
190, 2460, 3071, 3618, 38), d = c(1, 1, 1, 2, 1, 7)), .Names = c("s",
"r", "d"), row.names = c(NA, 6L), class = "data.frame")
المحلول
نعم، جواب تييري صحيح بالتأكيد أستطيع أن أقول مؤلفة مشتركة لحزمة "مصفوفة" ...
لسؤالك الآخر: لماذا الوصول إلى "M" أبطأ من "y"؟ الجواب الرئيسي هو أن "M" هو أكثر من ذلك بكثير sparser أكثر من "Y" وبالتالي أكثر أصغر بكثير و - اعتمادا على الأحجام المذدنة وذاكرة الوصول العشوائي الخاصة بك - وقت الوصول أسرع لكائنات أصغر بكثير، لا سيما للفهرسة فيها وبعد
نصائح أخرى
لماذا تريد قيم NA الافتراضية؟ بقدر ما أعرف المصفوفات متناثرة فقط إذا كانت لديهم خلايا صفرية. كما NA هي قيمة غير صفرية، فإنك تفقد كل الفوائد من مصفوفة متفرق. مصفوفة كلاسيكية أكثر كفاءة إذا كان المصفوفة بالكاد أي الأصفار. مصفوفة كلاسيكية مثل ناقلات سيتم قطعه وفقا للأبعاد. لذلك يتعين عليه تخزين ناقلات البيانات والأبعاد. يخزن مصفوفة Sparse فقط القيم غير الصفرية، ولكن أيضا مخازن هناك. هذه ميزة إذا ولتوجه فقط إذا كان لديك قيم صفرية كافية.