отмечая, что ваши данные эффективно 5 уровней от 1 до 5, закодированные как «a», «b», «a», «c» и «d», я пошел искать способы получить перестановки чисел 1-5, а затем переназначить эти до уровней, которые вы используете.
Начнем с ввода данных:
my_vec <- c("a","b","a","c","d") # the character
my_vec_ind <- seq(1,length(my_vec),1) # their identifier
Чтобы получить перестановки, я применил функцию, заданную на Generating all distinct permutations of a list in R:
permutations <- function(n){
if(n==1){
return(matrix(1))
} else {
sp <- permutations(n-1)
p <- nrow(sp)
A <- matrix(nrow=n*p,ncol=n)
for(i in 1:n){
A[(i-1)*p+1:p,] <- cbind(i,sp+(sp>=i))
}
return(A)
}
}
Во-первых, создать data.frame с перестановками:
tmp <- data.frame(permutations(length(my_vec)))
У вас теперь есть фрейм данных tmp
из 120 ro WS, где каждая строка представляет собой уникальную перестановка чисел, 1-5:
>tmp
X1 X2 X3 X4 X5
1 1 2 3 4 5
2 1 2 3 5 4
3 1 2 4 3 5
...
119 5 4 3 1 2
120 5 4 3 2 1
Теперь вам нужно переназначить их к струнам вы имели.Вы можете переназначить их, используя вариации на тему gsub()
, предложенной здесь: R: replace characters using gsub, how to create a function?
gsub2 <- function(pattern, replacement, x, ...) {
for(i in 1:length(pattern))
x <- gsub(pattern[i], replacement[i], x, ...)
x
}
gsub()
не будет работать, потому что у вас есть более одного значения в массиве замены.
Вам также нужна функция, которую вы можете позвонить, используя lapply()
, чтобы использовать функцию gsub2()
для каждого элемента вашего tmp
data.frame.
remap <- function(x,
old,
new){
return(gsub2(pattern = old,
replacement = new,
fixed = TRUE,
x = as.character(x)))
}
Практически там. Мы делаем отображение, как это:
shuffled_vec <- as.data.frame(lapply(tmp,
remap,
old = as.character(my_vec_ind),
new = my_vec))
, который может быть упрощена ...
shuffled_vec <- as.data.frame(lapply(data.frame(permutations(length(my_vec))),
remap,
old = as.character(my_vec_ind),
new = my_vec))
.. если вы чувствуете потребность.
Это дает Вам необходимый ответ:
> shuffled_vec
X1 X2 X3 X4 X5
1 a b a c d
2 a b a d c
3 a b c a d
...
119 d c a a b
120 d c a b a
могли бы вы предоставить некоторую обратную связь с 3-х ответов, которые у вас есть сейчас? –