2013-02-01 3 views
4

저는 R에 대한 경험이 있지만 항상 새로운 코드를 작성하는 데 어려움을 겪습니다. 내 현재 프로젝트에서 작업하는 동안 여러 유용한 게시물을 발견했지만 다음 단계를 찾을 수 없습니다. 여기에 내가 지금까지 한 일이 있습니다 :대체하지 않고 행렬의 열 값 샘플링

  • 랭킹 20x20 .csv를 가져 왔습니다. 각 열은 1에서 20까지의 각 정수의 인스턴스를 하나씩 포함하므로 모든 colSum은 210입니다. rowSums는 다양합니다.

  • 여기에 원래 행렬의 4 행을 무작위로 샘플링하여 새로운 4x20 행렬에 넣을 수있는 포스트를 사용했습니다.

이제 각 열에서 5 열을 샘플링해야합니다. 열을 교체하지 않아도됩니다. 즉, 각 열을 한 번만 사용하고 각 행에 5 개의 값이 있어야합니다. (나는 이것이 나에게 적절한 장소와 60 개의 0에 20 개의 값을 갖는 행렬을 제공하는지, 아니면 5 개의 값으로 4 개의 벡터를 얻는 지에 대한 우선 순위를 가지고 있지 않다. 나는 행렬을 원한다고 생각한다.)

컨텍스트가 도움이된다면 교실의 주제 순위를 기반으로 그룹을 만들려고합니다. 행은 주제이고 열은 유권자 (학생)입니다. 궁극적으로 나는 for 루프에서 이러한 무작위 할당을 만들고 프로그램을 여러 번 실행하여 원래의 행렬을 쳐다 보지 않고 자동으로 선택을 최적화합니다 (일부 측정에 의해, 분명히 최적화하는 다른 방법이 있음). 나는 과거에 해왔다.

이 내 4x20 행렬이다 : 내가 원하는

J E I S A N H T M B D K O G P L Q R F C 
2 5 4 1 1 5 13 3 4 13 11 14 14 20 9 15 9 11 17 9 15 
13 20 19 17 19 19 7 4 19 7 1 5 1 17 15 10 6 7 14 6 3 
14 18 2 12 14 11 19 18 15 19 4 8 19 2 2 13 7 9 1 12 10 
18 4 7 18 5 12 18 2 20 6 7 16 15 5 18 1 13 2 18 14 16 

이는 (한 버전) :

J E I S A N H T M B D K O G P L Q R F C 
2 0 4 1 1 0 0 3 4 0 0 0 0 0 0 0 0 0 0 0 0 
13 0 0 0 0 0 7 0 0 0 1 5 1 0 0 0 0 0 0 0 3 
14 0 0 0 0 11 0 0 0 0 0 0 0 0 2 0 7 0 1 12 0 
18 4 0 0 0 0 0 0 0 6 0 0 0 5 0 1 0 2 0 0 0 
+0

1 번 줄의 1 번 열을 샘플링하면 다른 줄의 1 번 열을 더 이상 샘플링 할 수 없게됩니다. – Rcoster

+0

Rcoster - 네, 맞아요. OP에서 목표의 예를 추가하겠습니다. – tbkent

답변

1

이 당신은 apply을 사용할 수 있습니다

data <- matrix(sample(letters,20*4,rep=T),4) # Create a fake data 

sample <- sample(1:20) # Scramble the order of the columns 

out <- matrix(0,4,5) # 5 letters for 4 lines 

for (i in 1:4) { 
out[i,] <- data[i,sample[1:5 + (i-1)*5]] # Sample 5 values of each line 
} 
7

을 작동합니다. 다음 명령은 무작위로 각 행에서 5 개 값을 샘플링하고 그 결과의 매트릭스 반환됩니다 : 당신은 원래 행렬에 맞게 t으로 반환 된 행렬을 전치 할 수

apply(mat, 1, sample, 5) 

합니다.

mat[cbind(seq(nrow(mat)), sample(ncol(mat), 5 * nrow(mat)))] 

그것은 값을 포함하는 벡터를 반환합니다 번만 모든 열을 사용하려면


, 다음과 같은 명령을 사용할 수 있습니다.

# create an index of the values to be kept 
idx <- cbind(seq(nrow(mat)), sample(ncol(mat), 5 * nrow(mat))) 

# create a new matrix of zeroes 
mat2 <- matrix(0, ncol = ncol(mat), nrow = nrow(mat)) 

# copy the values from the original matrix to the new one 
mat2[idx] <- mat[idx] 
+0

필자가 작성하려고했던 답변보다 훨씬 유용합니다. 간단한 루프와 샘플 된 행렬을 사용하면 쉽게이 작업을 수행 할 수 있지만 '적용'기능은 모든 것을 단일 문으로 결합합니다. 잘 부탁드립니다, 스벤. 마지막 파트가 아름답게 작동하는 – Dinre

+0

! 고마워 스벤. – tbkent

+0

@tbkent, 문제가 해결되면 도움이되는 답변을 선택하고 답의 왼쪽에 체크 표시를하십시오. – A5C1D2H2I1M1N2O1R2T1

1

당신의 data.frame라고 'x'를 가정하면, 여기에 결과 그 간단한 방법입니다 :

이 (매트릭스 0과 1 무작위로 선택된 값을 포함) 원하는 출력 형식을 일치 시키려면, 다음과 같은 전략을 사용할 수 있습니다 단일 행의 list에서 data.frames.

x <- structure(list(J = c(5L, 20L, 18L, 4L), E = c(4L, 19L, 2L, 7L 
), I = c(1L, 17L, 12L, 18L), S = c(1L, 19L, 14L, 5L), A = c(5L, 
    19L, 11L, 12L), N = c(13L, 7L, 19L, 18L), H = c(3L, 4L, 18L, 
    2L), T = c(4L, 19L, 15L, 20L), M = c(13L, 7L, 19L, 6L), B = c(11L, 
    1L, 4L, 7L), D = c(14L, 5L, 8L, 16L), K = c(14L, 1L, 19L, 15L 
), O = c(20L, 17L, 2L, 5L), G = c(9L, 15L, 2L, 18L), P = c(15L, 
    10L, 13L, 1L), L = c(9L, 6L, 7L, 13L), Q = c(11L, 7L, 9L, 2L), 
     R = c(17L, 14L, 1L, 18L), F = c(9L, 6L, 12L, 14L), C = c(15L, 
     3L, 10L, 16L)), .Names = c("J", "E", "I", "S", "A", "N", 
    "H", "T", "M", "B", "D", "K", "O", "G", "P", "L", "Q", "R", "F", 
    "C"), class = "data.frame", row.names = c("2", "13", "14", "18" 
)) 

그리고 샘플링 : 여기

는 데이터의

set.seed(1) 
temp <- matrix(sample(20), nrow = 4) 
do.call(rbind, lapply(1:4, function(y) { 
    x[y, -temp[y, ]] <- 0 
    x[y, ] 
})) 
#  J E I S A N H T M B D K O G P L Q R F C 
# 2 0 0 0 1 0 13 0 0 0 0 0 14 0 0 0 0 0 0 9 15 
# 13 20 0 0 0 0 0 0 19 0 1 0 0 0 15 0 0 7 0 0 0 
# 14 0 0 12 0 11 0 0 0 0 0 8 0 0 0 13 0 0 1 0 0 
# 18 0 7 0 0 0 0 2 0 6 0 0 0 5 0 0 13 0 0 0 0 
+0

이것 역시 멋지게 보입니다. 감사! – tbkent

1

Matrix 패키지를 사용하여, 우리는 인덱스에서 아주 쉽게 구축 할 수 있습니다

i <- sample(nrow(X), ncol(X), replace=TRUE) 
j <- seq(ncol(X)) 
sparseMatrix(i,j,x=X[cbind(i,j)]) 

수율 :

> sparseMatrix(i,j,x=X[cbind(i,j)]) 
4 x 20 sparse Matrix of class "dgCMatrix" 

[1,] . . . . . 13 . . 13 . 14 . . 9 . . . . . 15 
[2,] . . . . . . . . . . . . . . . . . . 6 . 
[3,] . . . 14 11 . . 15 . 4 . 19 2 . 13 . . . . . 
[4,] 4 7 18 . . . 2 . . . . . . . . 13 2 18 . . 
관련 문제