Тест перестановки для сопряженных данных с использованием цикла for

#r #permutation

#r #перестановка

Вопрос:

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

Пример набора данных:

    day1   day2
 1  5.5   1.5  
 2  2.5   6.5  
 3  7.5   8.5  
 4  4.5   1.5  
 5  5.5   1.5  
 

и я хочу, чтобы он случайным образом менял местами некоторые строки, например, это:

    day1   day2
 1  5.5   1.5  
 2  6.5   2.5 
 3  7.5   8.5  
 4  1.5   4.5  
 5  5.5   1.5  
 

Я пытался использовать команду sample(), но, похоже, она меняет местами целые строки, а не только некоторые из них. Итак, как вы случайным образом меняете местами некоторые из них?

Ответ №1:

Если вы хотите произвольно поменять местами столбцы определенных строк, попробуйте :

 set.seed(6781)
replace_inds <- sample(c(TRUE, FALSE), nrow(df), replace = TRUE)
df[replace_inds, ] <- df[replace_inds, 2:1]
df

#  day1 day2
#1  5.5  1.5
#2  2.5  6.5
#3  8.5  7.5
#4  4.5  1.5
#5  1.5  5.5
 

данные

 df <- structure(list(day1 = c(5.5, 2.5, 7.5, 4.5, 5.5), day2 = c(1.5, 
6.5, 8.5, 1.5, 1.5)), class = "data.frame", row.names = c(NA, -5L))
 

Ответ №2:

Вот однострочный вариант, который будет перетасовывать элементы в первом и втором столбцах. Он также будет работать, если нужно поменять местами несколько столбцов:

 setNames(as.data.frame(t(apply(df, 1, sample))), names(df))
#>   day1 day2
#> 1  1.5  5.5
#> 2  2.5  6.5
#> 3  8.5  7.5
#> 4  4.5  1.5
#> 5  5.5  1.5
 

Ответ №3:

Мы можем использовать pmap из purrr

 library(dplyr)
library(purrr)
df %>%
   pmap_dfr(~ sample(c(...)))
 

-вывод

 # A tibble: 5 x 2
#   day2  day1
#  <dbl> <dbl>
#1   1.5   5.5
#2   6.5   2.5
#3   8.5   7.5
#4   1.5   4.5
#5   1.5   5.5
 

данные

 df <- structure(list(day1 = c(5.5, 2.5, 7.5, 4.5, 5.5), day2 = c(1.5, 
6.5, 8.5, 1.5, 1.5)), class = "data.frame", row.names = c(NA, 
-5L))