تبادل الخلايا في dataframe لتقليل التأثير إلى مجموع فرق الارتباط

0

افترض أن هناك إطار بيانات أدناه:

set.seed(100)
toydata <- data.frame(x = sample(1:50,50,replace = T),
                      y = sample(1:50,50,replace = T),
                      z = sample(1:50,50,replace = T)
                      )

ثم أجد جميع الخلايا التي تكون قيمها أقل من 10. للعمود الأول:

toydata[toydata$x<10,1]

انا حصلت

[1] 3 9 9 7

بالنسبة للعمود الثاني ،

toydata[toydata$y<10,2]

فهمت ، فهمت

[1] 7 5 2 7 2

بالنسبة للعمود الثالث ،

toydata[toydata$z<10,3]

انا حصلت

[1] 3 1 5 2 2 6 1 3 5 8 7 3 1

ومواقفهم

which(toydata$x<10)
[1]  4 10 26 40
which(toydata$y<10)
[1]  7 30 35 48 49
which(toydata$z<10)
[1]  3  9 13 16 26 30 36 38 42 43 45 48 49

أريد تبديل القيم بين الخلايا التي تكون قيمها أقل من 10. القيم في الخلايا الأخرى التي تساوي قيمها أو تزيد عن 10 تبقى دون تغيير.

الشرط هو أنه يجب استبدال كل خلية بقيمة أقل من 10 بقيمة جديدة.

الهدف هو تقليل مجموع فرق الارتباط قبل التبديل وبعده ، كما يقول تصغير | cor (x، y) -cor (x '، y') | + | cor (x، z) -cor (x ' ، z ') | + | cor (y، z) -cor (y'، z ') |.

x '، y'، z 'هي الأعمدة الجديدة التي تم تبديلها.

|| يعني القيمة المطلقة.

هل هناك أي اقتراحات جيدة لتحقيق ذلك في R أو Python مع أي حزم؟

شكر.

1 إجابة

1
افضل جواب

إذا كان كل ما تريد القيام به هو تبديل القيم أسفل عتبة معينة ، مما يعني تبديل تلك القيم ، sample هو صديقك.

swapFun <- function(x, n = 10){
  inx <- which(x < n)
  x[sample(inx)] <- x[inx]
  x
}

toydata[toydata$x < 10, 1]
#[1] 3 9 9 7
which(toydata$x < 10)
#[1]  4 10 26 40

toy <- toydata    # Work with a copy
toy[] <- lapply(toydata, swapFun)

toy[toy$x < 10, 1]
#[1] 9 7 3 9
which(toy$x < 10)
#[1]  4 10 26 40

لاحظ أن ترتيب القيم أقل من 10 تغيرت ولكن ليس حيث يمكن العثور عليها.

إذا كنت تريد عتبة أخرى ، قل 25 ، افعل فقط

toydata[] <- lapply(toydata, swapFun, n = 25)

للتبديل بين الأعمدة ، استخدم وظيفة أخرى. يبدأ بتحويل الإدخال data.frame إلى ناقل. تتم عملية التبادل بنفس الطريقة. ثم العودة إلى data.frame .

swapFun2 <- function(DF, n = 10){
  x <- unlist(DF)
  inx <- which(x < n)
  x[sample(inx)] <- x[inx]
  x <- as.data.frame(matrix(x, ncol = ncol(DF)))
  names(x) <- names(DF)
  x
}

toy2 <- swapFun2(toydata)
:مؤلف
فوق
قائمة طعام