2016-10-28 5 views
0

며칠 전에 R로 시작하여 실제로 도움이 될 수있었습니다. D 현재 나는 200 개의 관측치와 12 개의 변수가있는 data.frame을가집니다. 그들은 c1-c12라고 부름).문제 데이터 프레임을 디자인 매트릭스로 변환

배경 : 사용자가 필드를 클릭하면 (최대 12 번) 필드에 표시됩니다. 이 필드는 6 행과 4 열로 정렬되고, 사용자의 클릭은 번호 :

[,1] [,2] [,3] [,4] 
[1,] "11" "21" "31" "41" 
[2,] "12" "22" "32" "42" 
[3,] "13" "23" "33" "43" 
[4,] "14" "24" "34" "44" 
[5,] "15" "25" "35" "45" 
[6,] "16" "26" "36" "46" 

각 값의 첫 번째 숫자는 행을 나타내고, 두 번째 열로서 기록된다. 그게 그들이 11-16, 21-26 ... 41-46이라고 지명되는 이유입니다. 값의 범위는 c (11:16, 21:26, 31:36, 41:46)이므로 가능한 값은 24 개입니다.

나는 R로 데이터를 읽을 수 있었고, 처음 10 명 관찰은 다음과 같이 :

내 데이터 : 내가 디자인 매트릭스의 일종으로 내 데이터를 변환 할

c1 c2 c3 c4 c5 c6 c7 c8 c9 c10 c11 c12 
1 33 43 63 23 34 32 31 41 61 21 NA NA 
2 24 23 22 21 31 61 41 NA NA NA NA NA 
3 61 62 63 64 31 32 33 34 41 42 43 44 
4 31 32 33 34 21 22 23 24 41 NA NA NA 
5 11 12 13 14 22 23 32 33 62 63 42 52 
6 51 52 53 54 61 62 63 64 31 32 33 34 
7 31 21 61 62 63 64 33 23 NA NA NA NA 
8 41 42 43 44 32 33 62 63 52 53 61 64 
9 61 62 63 64 21 22 24 23 34 31 41 44 
10 51 52 53 54 24 34 21 31 33 23 61 63 

: 원하는 출력 나는 6 개의 행과 4 개의 열과 필드를 클릭했을 때 1을 포함하여 관찰 당 하나의 행렬이 필요합니다 (즉 위치의 값) ob의 일부입니다. servation) 및 모든 다른 위치에 대해서는 0입니다. 첫 번째 관찰은 다음과 같을 것이다 :

0 1 1 1 0 1 
0 0 1 0 0 0 
0 1 1 1 0 1 
0 0 1 0 0 0 

당신이 내게로보고 어쩌면이 같은 지침이나 뭐 같은 조언을한다 등 패키지 팁을 줄 수 있는가?

내 생각은 위치에 대한 행렬을 작성한 다음 관측치를 곱하는 것이었지만 현재는 정말 어려움을 겪고 있으며 어디서부터 시작해야할지 몰라요.

R에서 내 위치 행렬은 이제 다음과 같습니다

#construct design matrix 
alt1 <- c(paste0(1, 1:6)) 
alt2 <- c(paste0(2, 1:6)) 
alt3 <- c(paste0(3, 1:6)) 
alt4 <- c(paste0(4, 1:6)) 
positions <- matrix(c(alt1, alt2, alt3, alt4), nrow = 6) 

(배경에서 제공)

** 방법보다 쉽고 똑똑한 솔루션이있을 수 있습니다 제 값합니다 (ROWNUMBER를 포함하기 첫 번째 숫자)와 columnnr (두 번째 숫자),하지만 난 위치에 의해 매트릭스로를 작성하는 방법을 잘 모릅니다 **

dput(head(data)) 
structure(list(c1 = c("33", "24", "61", "31", "11", "51"), c2 = c("43", 
"23", "62", "32", "12", "52"), c3 = c("63", "22", "63", "33", 
"13", "53"), c4 = c("23", "21", "64", "34", "14", "54"), c5 = c("34", 
"31", "31", "21", "22", "61"), c6 = c("32", "61", "32", "22", 
"23", "62"), c7 = c("31", "41", "33", "23", "32", "63"), c8 = c("41", 
"", "34", "24", "33", "64"), c9 = c("61", NA, "41", "41", "62", 
"31"), c10 = c("21", NA, "42", "", "63", "32"), c11 = c("", NA, 
"43", NA, "42", "33"), c12 = c(NA, NA, "44", NA, "52", "34")), .Names = c("c1", 
"c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11", 
"c12"), row.names = c(NA, 6L), class = "data.frame") 

건배 및 감사, Sidebob

+0

입력 내용과 예상 출력에 대해 자세히 설명해 주실 수 있습니까? –

+0

예 : 사용자가 필드를 클릭하면 (최대 12 번) 필드에 표시됩니다. 이 필드는 6 행 4 열입니다. 그게 그들이 11-16, 21-26 ... 41-46이라고 지명되는 이유입니다. 이제 내 입력은 200 명의 관측자 (사용자)와 12 번의 클릭으로 숫자로 기록됩니다. 출력으로 나는 6 개의 행과 4 개의 열을 포함하는 사용자 당 하나의 행렬과 필드를 클릭했을 때 1, 그렇지 않은 경우 0을 필요로합니다. – sidebob

+0

데이터를 쉽게 복사하여 붙여 넣기하십시오. –

답변

0

간단한 루프를 사용하여 개별 선을 가져 와서이를 행렬 으로 변환 할 수 있습니다.

for(row in 1:nrow(data)) { 
    x <- as.numeric(data[row,]) 
    i <- x %% 10 
    j <- x %/% 10 
    mat <- matrix(0, 6, 6) 
    mat[cbind(i,j)] <- 1 
    print(mat) 
    } 

 [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 0 1 1 1 0 1 
[2,] 0 0 1 0 0 0 
[3,] 0 1 1 1 0 1 
[4,] 0 0 1 0 0 0 
[5,] 0 0 0 0 0 0 
[6,] 0 0 0 0 0 0 
    [,1] [,2] [,3] [,4] [,5] [,6] 
[1,] 0 1 1 1 0 1 
[2,] 0 1 0 0 0 0 
[3,] 0 1 0 0 0 0 
[4,] 0 1 0 0 0 0 
[5,] 0 0 0 0 0 0 
[6,] 0 0 0 0 0 0 
    ... 

난 당신이 기대하는 출력의 종류를 모르겠습니다 제공합니다. 을 인쇄하고 sink()과 함께 파일로 출력 할 수 있습니다. write()을 파일로 보내거나 write.table()을 csv 형식으로 입력 할 수 있습니다.

그런데 루프가 느리며 이 R에서 회피되어야한다고 주장하는 경우가 있습니다. 그러나이 경우에는 정상적으로 작동하며 은 이해하기 쉽습니다.

+0

답을위한 Thx Ott !, 처음으로 매트릭스 매트를 만들었습니까? 코드 스 니펫이 현재 실행되고 있지 않습니다. 텍스트 파일에 모든 작은 행렬이 1과 0으로 차례로 필요합니다. 나는 그들에 대한 견적을 입력으로 필요합니다 – sidebob

+0

정말 고마워요! 굉장해. 너는 내 하루를 만들었다. – sidebob

관련 문제