2017-09-08 2 views
1

Mon jeu de données provient d'un test sur ordinateur, un exemple est donné ci-dessous.Remplacement de valeurs d'un ensemble de données de résultats de test sur ordinateur à l'aide de la touche de correction

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 

Les colonnes représentent des questions et les lignes représentent des candidats. La première rangée est la clé de correction. M signifie sans réponse. Je dois remplacer les valeurs telles que Ms sont remplacées par "NA" et bonnes réponses avec 1 et mauvaises réponses avec 0. EX. Pour q1, la bonne réponse est "A", donc la valeur du candidat 3, "C", a pour être remplacée par 0 puisque la réponse est fausse.

L'ensemble de données final devrait ressembler à ceci

 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 Mme sont assez simples.

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

Mais je trouve difficile de remplacer les autres valeurs en une seule étape.

x<-as.matrix(x) 

transformé à la matrice depuis trame de données renvoie une erreur « Erreur dans Ops.factor (gauche, droite): ensembles de niveaux de facteurs sont différents »

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) 
    }} 

Cette boucle remplace uniquement les valeurs de la première colonne.

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" 

Comment puis-je effectuer des remplacements pour tout le jeu de données?

Répondre

6

Vous ne devez pas inclure la clé dans la structure de données sous forme d'observation (ligne). Conceptuellement, cela n'appartient pas à la réalité. Vous devriez aussi travailler avec une matrice au lieu d'un 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 

Notez que j'ai corrigé les fautes de frappe dans vos données.

1

Utiliser dplyr pour muter toutes les colonnes:

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 

(Note: les données d'échantillon comprend des réponses dans les deux minuscules & supérieure, donc je suppose que les deux entrées ont été autorisées par l'ordinateur Si ce n'est pas le cas. & toutes les réponses sont en majuscules, la partie toupper() peut être ignorée.)

+0

Ce fut une faute de frappe, tous sont en majuscules. Cela fonctionne parfaitement, merci! – cbsethu

+2

Notez que toutes les valeurs du résultat seront des caractères. Cela pourrait avoir une incidence sur les étapes suivantes de l'analyse des données. – Roland

-1

Avec ifelse fonction vous pouvez faire:

#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

Son fonctionnement, merci :) – cbsethu

+0

Dans la taille réelle du scénario de l'ensemble de données est inconnue, il pourrait être 10 000 candidats et 1000 questions. Par conséquent 5 doit être remplacé par nrow (x) -1. x [-1,] = ifelse (x [-1,] == matrice (rep (as.matrice (x [1,]), nrow (x) -1, nrow = nrow (x) -1, byrow = TRUE), 1,0) – cbsethu

+0

Apprécierait les commentaires de downvoter ... – OdeToMyFiddle