R: кадр данных Рандомизировать столбцы по строке - PullRequest
2 голосов
/ 07 ноября 2011

У меня есть кадр данных в R, который я хочу рандомизировать, сохраняя первый столбец таким, как он есть, но рандомизируя два последних столбца вместе, так что значения, которые появляются в одних и тех же строках в этих столбцах, появятся в одной строке и послерандомизации.Поэтому, если бы я начал с этого:

1 a b c 
2 d e f 
3 g h i 

при рандомизации это может выглядеть следующим образом:

1 a e f 
2 d h i 
3 g b c 

Я знаю, что образец работает нормально, но сохраняет ли он эквивалентность столбцов?

Ответы [ 4 ]

3 голосов
/ 07 ноября 2011
> t <- data.frame(matrix(nrow=4,ncol=10,data=1:40))
> t
    X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
    1  1  5  9 13 17 21 25 29 33  37
    2  2  6 10 14 18 22 26 30 34  38
    3  3  7 11 15 19 23 27 31 35  39
    4  4  8 12 16 20 24 28 32 36  40
> columns_to_random <- c(8,9,10)
> t[,columns_to_random] <- t[sample(1:nrow(t),size=nrow(t)), columns_to_random]
>   X1 X2 X3 X4 X5 X6 X7 X8 X9 X10
    1  1  5  9 13 17 21 25 32 36  40
    2  2  6 10 14 18 22 26 29 33  37
    3  3  7 11 15 19 23 27 30 34  38
    4  4  8 12 16 20 24 28 31 35  39
1 голос
/ 07 ноября 2011

Просто выберите один столбец за раз, и все будет в порядке.Например:

data[,2] = sample(data[,2])
data[,3] = sample(data[,3])
...

Если у вас много столбцов, вы можете расширить это следующим образом:

data[,-1] = apply(data[,-1], 2, sample)

РЕДАКТИРОВАТЬ: С вашим разъяснением об эквивалентности строк это просто:

data[,-1] = data[sample(nrow(data)),-1]
0 голосов
/ 13 января 2014

Подход с использованием colwise in plyr для элегантной перестановки столбцов:

test <- data.frame(matrix(nrow=4,ncol=10,data=1:40))

Load plyr

require(plyr)

Создание функции выборки для столбцов

colwise.sample <- colwise(sample)

Применить к нужным строкам

permutation.test <- test
permutation.test[,c(1,3,4)] <- colwise.sample(test[,c(1,3,4)])
0 голосов
/ 07 ноября 2011

Что вы подразумеваете под "эквивалентностью значений"? Честно говоря, я не понимаю сообщение, но вот мое предположение. Как вы сказали, вы можете использовать образец, но использовать его отдельно в столбцах, например по заявке:

 # create a reproducible example
 test <- data.frame(indx=c(1,2,3),col1=c("a","d","g"),
               col2=c("b","e","h"),col3=c("c","f","i"))

 xyz <- apply(test[,-1],MARGIN=2,sample)
 as.data.frame(xyz)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...