데이터 프레임을 행별 및 열별로 랜덤화(또는 순열화)하는 방법
저는 이런 데이터 프레임(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")
times
입니다. 서 99는 랜덤화 행렬입니다. 여기서 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 모델 옵션도 있습니다. 설명서의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
'prosource' 카테고리의 다른 글
node.js를 사용하여 이미지 다운로드 (0) | 2023.06.07 |
---|---|
Excel 셀 형식 지정(통화) (0) | 2023.06.07 |
Xcode 4.3에서 "응용 프로그램에 유효한 'aps-environment' 자격 문자열을 찾을 수 없음"을 수정하는 방법은 무엇입니까? (0) | 2023.06.07 |
MSBuild 스크립트 및 VS2010 게시 apply Web.config Transform (0) | 2023.06.07 |
스크립트 + 스크립트에서 변수의 유형을 확인하는 방법은 무엇입니까? (0) | 2023.06.07 |