توليد متغيرات التفاعل في R DataFrames
سؤال
هل هناك طريقة - بخلاف حلقة - لإنشاء متغيرات جديدة في DataFrame R ، والتي ستكون جميع التفاعلات ذات الاتجاهين الممكنة بين تلك الموجودة؟ على سبيل المثال ، لنفترض أن إطار بيانات مع ثلاثة متغيرات رقمية V1 ، V2 ، V3 ، أود إنشاء المتغيرات الجديدة التالية:
Inter.V1V2 (= V1 * V2)
Inter.V1V3 (= V1 * V3)
Inter.V2V3 (= V2 * V3)
مثال باستخدام حلقة:
x <- read.table(textConnection('
V1 V2 V3 V4
1 9 25 18
2 5 20 10
3 4 30 12
4 4 34 16'
), header=TRUE)
dim.init <- dim(x)[2]
for (i in 1: (dim.init - 1) ) {
for (j in (i + 1) : (dim.init) ) {
x[dim(x)[2] + 1] <- x[i] * x[j]
names(x)[dim(x)[2]] <- paste("Inter.V",i,"V",j,sep="")
}
}
المحلول
إليك بطانة واحدة لك تعمل أيضًا إذا كان لديك عوامل:
> model.matrix(~(V1+V2+V3+V4)^2,x)
(Intercept) V1 V2 V3 V4 V1:V2 V1:V3 V1:V4 V2:V3 V2:V4 V3:V4
1 1 1 9 25 18 9 25 18 225 162 450
2 1 2 5 20 10 10 40 20 100 50 200
3 1 3 4 30 12 12 90 36 120 48 360
4 1 4 4 34 16 16 136 64 136 64 544
attr(,"assign")
[1] 0 1 2 3 4 5 6 7 8 9 10
نصائح أخرى
هنا تذهب ، باستخدام combn
و apply
:
> x2 <- t(apply(x, 1, combn, 2, prod))
يمكن إجراء أسماء الأعمدة باستخدام اثنين paste
الأوامر:
> colnames(x2) <- paste("Inter.V", combn(1:4, 2, paste, collapse="V"), sep="")
أخيرًا ، إذا كنت تريد كل متغيراتك معًا ، فقط cbind
هم:
> x <- cbind(x, x2)
> V1 V2 V3 V4 Inter.V1V2 Inter.V1V3 Inter.V1V4 Inter.V2V3 Inter.V2V4 Inter.V3V4
1 1 9 25 18 9 25 18 225 162 450
2 2 5 20 10 10 40 20 100 50 200
3 3 4 30 12 12 90 36 120 48 360
4 4 4 34 16 16 136 64 136 64 544
أعتقد أن هذا السؤال يجب أن يستكمل مع poly/polym
الوظيفة ، التي تذهب مستقبلية: فهي لا تولد التفاعلات فقط بين المتغيرات ، ولكن قوتها حتى الدرجة المحددة. و التكرارات المتعامدة, والتي قد تكون مفيدة جدا.
سيكون الحل المباشر للمشكلة المطلوبة:
> polym(x$V1, x$V2, x$V3, x$V4, degree = 2, raw = T)
1.0.0.0 2.0.0.0 0.1.0.0 1.1.0.0 0.2.0.0 0.0.1.0 1.0.1.0 0.1.1.0 0.0.2.0 0.0.0.1 1.0.0.1 0.1.0.1 0.0.1.1 0.0.0.2
[1,] 1 1 9 9 81 25 25 225 625 18 18 162 450 324
[2,] 2 4 5 10 25 20 40 100 400 10 20 50 200 100
[3,] 3 9 4 12 16 30 90 120 900 12 36 48 360 144
[4,] 4 16 4 16 16 34 136 136 1156 16 64 64 544 256
attr(,"degree")
[1] 1 2 1 2 2 1 2 2 2 1 2 2 2 2
الأعمدة 4 ، 7 ، 8 ، 11 ، 12 ، 13 لديها المطلوبة في السؤال. الأعمدة الأخرى لها أنواع أخرى من التفاعلات. إذا كنت ترغب في الحصول على تفاعلات متعامدة ، فما عليك سوى تعيين raw = FALSE
.