سؤال

هل هناك طريقة - بخلاف حلقة - لإنشاء متغيرات جديدة في 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.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top