[r] 데이터 프레임을 행 및 열 방향으로 무작위 화 (또는 영구화)하는 방법은 무엇입니까?
이와 같은 데이터 프레임 (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 행은 열 이름입니다.
sample (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 중 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
추신. 두 개의 열을 무작위로 지정하는 것에 대한 이전 질문에 대한 이전 답변에 대해 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
using 패키지 를 섞는 또 다른 방법입니다 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")
times
원하는 무작위 행렬의 수입니다. 여기서 99burnin
무작위 샘플 채취를 시작하기 전에 이루어진 스왑 횟수입니다. 이것은 우리가 각 무작위 행렬을 취하기 시작하기 전에 우리가 샘플링하는 행렬이 상당히 무작위가되도록합니다.thin
모든thin
스왑을 무작위로 추첨한다고 말합니다.mtype = "prab"
매트릭스를 존재 / 부재, 즉 바이너리 0/1 데이터로 취급합니다.
몇 가지 유의해야 할 점은 열이나 행이 무작위 화되었음을 보장하지는 않지만 burnin
충분히 길다면 그런 일이 발생할 가능성이 높습니다. 또한 필요한 것보다 더 많은 임의의 행렬을 그리고 모든 요구 사항과 일치하지 않는 행렬을 버릴 수 있습니다.
행당 변경 횟수가 달라야하는 요구 사항도 여기에서 다루지 않습니다. 다시 원하는 것보다 더 많은 행렬을 샘플링 한 다음이 요구 사항을 충족하지 않는 행렬은 버릴 수 있습니다.
답변
randomizeMatrix
R 패키지 의 함수 를 사용할 수도 있습니다.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 모델 옵션도 있습니다. 문서 의 자세한 내용 (36 페이지)은 다음 링크를 확인하세요. picante
답변
물론 각 행을 샘플링 할 수 있습니다.
sapply (1:4, function (row) df1[row,]<<-sample(df1[row,]))
행 자체를 셔플하므로 1
각 행의 의 수가 변경되지 않습니다. 작은 변화와 열에서도 잘 작동하지만 이것은 독자를위한 연습입니다 😛
답변
다음과 같이 데이터 프레임에서 동일한 수의 항목을 “샘플링”할 수도 있습니다.
nr<-dim(M)[1]
random_M = M[sample.int(nr),]
답변
목표가 각 열을 무작위로 섞는 것이라면 열이 공동으로 섞여 있기 때문에 위의 답변 중 일부가 작동하지 않습니다 (이는 열 간 상관 관계를 유지함). 다른 것들은 패키지를 설치해야합니다. 그러나 한 줄짜리가 있습니다.
df2 = lapply(df1, function(x) { sample(x) })