prosource

데이터 프레임을 행별 및 열별로 랜덤화(또는 순열화)하는 방법

probook 2023. 6. 7. 23:00
반응형

데이터 프레임을 행별 및 열별로 랜덤화(또는 순열화)하는 방법

저는 이런 데이터 프레임(df1)을 가지고 있습니다.

     f1   f2   f3   f4   f5
d1   1    0    1    1    1  
d2   1    0    0    1    0
d3   0    0    0    1    1
d4   0    1    0    0    1

d1...d4 열은 행 이름이고, f1...f5 행은 열 이름입니다.

샘플(df1)을 하기 위해, 나는 df1과 동일한 카운트 1의 새로운 데이터 프레임을 얻습니다.따라서 전체 데이터 프레임에 대한 카운트 1은 유지되지만 각 행 또는 각 열에 대한 카운트는 유지되지 않습니다.

행 단위 또는 열 단위로 랜덤화를 수행할 수 있습니까?

각 열에 대해 df1을 랜덤화하려고 합니다. 즉, 각 열에 있는 1의 숫자가 동일하게 유지됩니다.각 열을 한 번 이상 변경해야 합니다.예를 들어, 다음과 같은 df2를 랜덤화할 수 있습니다. (각 열의 1 카운트는 동일하지만 각 행의 1 카운트는 서로 다릅니다.)

     f1   f2   f3   f4   f5
d1   1    0    0    0    1  
d2   0    1    0    1    1
d3   1    0    0    1    1
d4   0    0    1    1    0

마찬가지로 각 행에 대해 df1을 랜덤화하려고 합니다. 즉, 각 행의 1번은 동일하게 유지되고 각 행을 변경해야 합니다(변경된 항목의 번호는 다를 수 있음).예를 들어, 무작위 df3는 다음과 같습니다.

     f1   f2   f3   f4   f5
d1   0    1    1    1    1  <- two entries are different
d2   0    0    1    0    1  <- four entries are different
d3   1    0    0    0    1  <- two entries are different
d4   0    0    1    0    1  <- two entries are different

PS. 두 개의 열을 랜덤화하는 것에 대한 이전 질문에 대한 이전 답변에 대해 Gavin Simpson, Joris Meys 및 Chase의 도움에 감사드립니다.

R data.frame이 지정된 경우:

> df1
  a b c
1 1 1 0
2 1 0 0
3 0 1 0
4 0 0 0

행 방향으로 셔플:

> df2 <- df1[sample(nrow(df1)),]
> df2
  a b c
3 0 1 0
4 0 0 0
2 1 0 0
1 1 1 0

으로 기적으로sample()첫 번째 인수로 전달된 요소의 순서를 임의로 변경합니다.즉, 기본 크기는 전달된 배열의 크기입니다. 전달 중replace=FALSE(에서 (으)로 설정합니다sample(...)샘플링이 교체되지 않고 행별 셔플을 수행하도록 보장합니다.

열 방향으로 셔플:

> df3 <- df1[,sample(ncol(df1))]
> df3
  c a b
1 0 1 1
2 0 1 0
3 0 0 1
4 0 0 0

이것은 다른 방법으로 섞을 수 있습니다.data.frame 키지용 dplyr:

행 방향:

df2 <- slice(df1, sample(1:n()))

또는

df2 <- sample_frac(df1, 1L)

열 단위:

df2 <- select(df1, one_of(sample(names(df1)))) 

.permatswap()채식주의자 패키지에.다음 예제에서는 행 및 열 합계를 모두 유지하지만 이를 완화하고 행 또는 열 합계 중 하나만 수정할 수 있습니다.

mat <- matrix(c(1,1,0,0,0,0,0,1,1,0,0,0,1,1,1,0,1,0,1,1), ncol = 5)
set.seed(4)
out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")

이것은 다음을 제공합니다.

R> out$perm[[1]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    0    1    1    1
[2,]    0    1    0    1    0
[3,]    0    0    0    1    1
[4,]    1    0    0    0    1
R> out$perm[[2]]
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    1    0    1    1
[2,]    0    0    0    1    1
[3,]    1    0    0    1    0
[4,]    0    0    1    0    1

통화 내용 설명하기

out <- permatswap(mat, times = 99, burnin = 20000, thin = 500, mtype = "prab")
  1. times입니다. 서 99는 랜덤화 행렬입니다. 여기서 99
  2. burnin무작위 표본 추출을 시작하기 전에 수행된 스왑 횟수입니다.일 수 있습니다.
  3. thin는 매번 .thin
  4. mtype = "prab"행렬을 존재/존재로 처리합니다. 즉, 이진 0/1 데이터입니다.

몇 가지 주의할 점은, 이것이 어떤 열이나 행이 무작위화되었다는 것을 보장하지는 않지만, 만약burnin그런 일이 일어날 가능성이 충분히 있습니다.또한 필요한 것보다 더 많은 랜덤 행렬을 그리고 모든 요구 사항과 일치하지 않는 랜덤 행렬을 폐기할 수 있습니다.

행당 변경 횟수가 달라야 하는 요구 사항도 여기에서 다루지 않습니다.원하는 것보다 더 많은 행렬을 표본으로 추출한 다음 이 요구 사항을 충족하지 않는 행렬도 폐기할 수 있습니다.

당신은 또한 사용할 수 있습니다.randomizeMatrixR 패키지의 기능picante

예:

test <- matrix(c(1,1,0,1,0,1,0,0,1,0,0,1,0,1,0,0),nrow=4,ncol=4)
> test
     [,1] [,2] [,3] [,4]
[1,]    1    0    1    0
[2,]    1    1    0    1
[3,]    0    0    0    0
[4,]    1    0    1    0

randomizeMatrix(test,null.model = "frequency",iterations = 1000)

     [,1] [,2] [,3] [,4]
[1,]    0    1    0    1
[2,]    1    0    0    0
[3,]    1    0    1    0
[4,]    1    0    1    0

randomizeMatrix(test,null.model = "richness",iterations = 1000)

     [,1] [,2] [,3] [,4]
[1,]    1    0    0    1
[2,]    1    1    0    1
[3,]    0    0    0    0
[4,]    1    0    1    0
> 

옵션null.model="frequency"열 합을 유지합니다.richness행 합계를 유지합니다.커뮤니티 생태학에서 종 존재 부재 데이터 세트를 무작위화하는 데 주로 사용되지만 여기서는 잘 작동합니다.

이 기능에는 기타 Null 모델 옵션도 있습니다. 설명서picante 자세한 내용(36페이지)은 다음 링크를 참조하십시오.

물론 각 행을 샘플링할 수 있습니다.

sapply (1:4, function (row) df1[row,]<<-sample(df1[row,]))

행 자체를 섞을 것이므로, 수1각 행의 의 값은 변경되지 않습니다.작은 변화와 열에도 효과적이지만, 이것은 독자를 위한 연습입니다:-P

각 열을 랜덤하게 섞는 것이 목표인 경우 열이 함께 섞이기 때문에 위의 답변 중 일부는 작동하지 않습니다(열 간 상관 관계가 유지됨).다른 경우에는 패키지를 설치해야 합니다.하지만 하나의 라인이 존재합니다.

df2 = lapply(df1, function(x) { sample(x) })

다음과 같은 방법으로 데이터 프레임에서 동일한 수의 항목을 "샘플링"할 수도 있습니다.

nr<-dim(M)[1]
random_M = M[sample.int(nr),]

데이터 프레임의 랜덤 샘플 및 순열 행렬 형식인 경우 data.frame은 기본 패키지 인덱스 = sample(1:nrow(df1), size=1*nrow(df1) 랜덤 샘플 및 순열의 샘플 함수를 사용합니다.

여기 있습니다.data.table옵션 사용.N와 함께sample다음과 같이:

library(data.table)
setDT(df)
df[sample(.N)]
#>    a b c
#> 1: 0 1 0
#> 2: 1 1 0
#> 3: 1 0 0
#> 4: 0 0 0

reprex v2.0.2를 사용하여 2023-01-28에 생성됨


데이터:

df <- read.table(text = "  a b c
1 1 1 0
2 1 0 0
3 0 1 0
4 0 0 0", header = TRUE)

언급URL : https://stackoverflow.com/questions/6422273/how-to-randomize-or-permute-a-dataframe-rowwise-and-columnwise

반응형