2017-09-08 6 views
1

내 데이터 세트는 컴퓨터 기반 테스트에서 가져 왔으며 샘플은 아래에 나와 있습니다.답변 키를 사용하여 컴퓨터 기반 테스트 결과 데이터 세트로 대체

x<-data.frame(rbind(c("A","C","A","B","A"), 
        c("M","M","M","M","M"), 
        c("M","M","M","M","M"), 
        c("C","C","A","C","A"), 
        c("C","C","B","C","A"), 
        c("A","C","A","C","B"))) 

colnames(x)<-c("q1","q2","q3","q4","q5") 
rownames(x)<-c("key","c1","c2","c3","c4","c5") 
    q1 q2 q3 q4 q5 
key A C A B A 
c1 M M M M M 
c2 M M M M M 
c3 C C A C A 
c4 C C B C A 
c5 A C A C B 

열은 질문을 나타내고 행은 후보를 나타냅니다. 첫 번째 행이 대답 키입니다. M은 답이 없다. M이 "NA"로 바뀌고 1로 답이 바뀌고 0으로 오답으로 바뀌는 값을 바꿔야합니다. EX. q1의 경우 올바른 대답은 "A"이므로 후보 3의 값인 "C"는 대답이 잘못되었으므로 이 0으로 대체됩니다.

마지막 데이터 셋이

 q1 q2 q3 q4 q5 
key A C A B A 
c1 <NA> <NA> <NA> <NA> <NA> 
c2 <NA> <NA> <NA> <NA> <NA> 
c3  0 1 1 0 1 
c4  0 1 0 0 1 
c5  1 1 1 0 0 

Replcaing 미스과 같아야은 매우 간단합니다.

x[x=="M"]<-NA 

하지만 다른 값을 한 번에 대체하기가 어렵습니다.

x<-as.matrix(x) 

dataframe는 "Ops.factor (왼쪽, 오른쪽)에 오류 요소 레벨 세트는 상이한"오류 발생 이후 - 매트릭스 변환 루프

for(i in 2:nrow(x)){ 
    for(j in 1:ncol(x)) 
    { 
    ifelse(x[i][j]==x[1][j],x[i][j]<-1,x[i][j]<-0) 
    }} 

이 값만 대체를 첫 번째 열의

q1 q2 q3 q4 q5 
key "A" "C" "A" "B" "A" 
c1 NA NA NA NA NA 
c2 NA NA NA NA NA 
c3 "0" "C" "A" "C" "A" 
c4 "0" "C" "B" "C" "A" 
c5 "1" "C" "A" "C" "B" 

어떻게 전체 데이터 세트를 대체 할 수 있습니까?

답변

6

데이터 구조에 키를 관찰 (행)으로 포함하면 안됩니다. 개념적으로 그것은 거기에 속하지 않습니다. 또한 data.frame 대신 매트릭스로 작업해야합니다.

x <- as.matrix(x) 
key <- x[1,] 
x <- x[-1,] 

x[x == "M"] <- NA 

#matrices are filled by column, 
#thus we need to transpose 
#unary plus turns the logical matrix into an integer matrix 
y <- +(t(t(x) == key)) 
# q1 q2 q3 q4 q5 
#c1 NA NA NA NA NA 
#c2 NA NA NA NA NA 
#c3 0 1 1 0 1 
#c4 0 1 0 0 1 
#c5 1 1 1 0 0 

데이터의 오타가 수정되었습니다. ifelse와

1

모든 열을 돌연변이 dplyr 사용 :

library(dplyr) 

# after the NA inputation step 

x %>% 
    mutate_all(funs(ifelse(row_number(.) == 1, 
         as.character(.), # leave first row unchanged 
         as.numeric(toupper(.) == first(.))))) #compare subsequent rows with first 

    q1 q2 q3 q4 q5 
1 A C A B A 
2 <NA> <NA> <NA> <NA> <NA> 
3 <NA> <NA> <NA> <NA> <NA> 
4 0 1 1 0 1 
5 0 1 0 0 1 
6 1 1 1 0 0 

(참고 : 샘플 데이터는 모두 상위 & 소문자 답변을 포함, 그래서 나는 두 입력이 컴퓨터에 의해 허용 된 것으로 가정 그런 경우가 아니라면. & 모든 대답은 대문자이므로 toupper() 부분을 건너 뛸 수 있습니다.)

+0

, 모두 대문자입니다. 이것은 완벽하게 작동합니다, 감사합니다! – cbsethu

+2

결과의 모든 값은 문자가됩니다. 이는 데이터 분석의 후속 단계에서 중요 할 수 있습니다. – Roland

-1

당신이 할 수있는 기능 : 오타를했다

#When working with character data, take note of this option stringsAsFactors=FALSE 
# Candidate c4 data has lower key C, corrected it below 


x = data.frame(rbind(c("A","C","A","B","A"), 
        c("M","M","M","M","M"), 
        c("M","M","M","M","M"), 
        c("C","C","A","C","A"), 
        c("c","c","B","C","A"), 
        c("A","C","A","C","B")),stringsAsFactors=FALSE) 



#all upper case     
x = sapply(x,toupper) 

colnames(x) = c("q1","q2","q3","q4","q5") 
rownames(x) = c("key","c1","c2","c3","c4","c5") 

#replace M's 
x[x == "M"] = NA 



#Match each row with key vector x[1,], repeated 5 time to match number of rows of original dataset 


x[-1,] = ifelse(x[-1,] == matrix(rep(as.matrix(x[1,]),5),nrow=5,byrow=TRUE),1,0) 

x 

# q1 q2 q3 q4 q5 
#key "A" "C" "A" "B" "A" 
#c1 NA NA NA NA NA 
#c2 NA NA NA NA NA 
#c3 "0" "1" "1" "0" "1" 
#c4 "0" "1" "0" "0" "1" 
#c5 "1" "1" "1" "0" "0"     
+0

그 작업, 고마워요 :) – cbsethu

+0

데이터 집합의 실제 시나리오 크기를 알 수없는 경우 10,000 개의 후보와 1000 개의 질문이 될 수 있습니다. 따라서 5는 nrow (x) -1로 대체되어야합니다. x [-1,] = ifelse (x [-1,] == 행렬 (rep (as.matrix (x [1]), nrow (x) -1, nrow = nrow (x) byrow = TRUE), 1,0) – cbsethu

+0

downvoter 님의 댓글을 고맙게 생각합니다 ... – OdeToMyFiddle