使用回答键替换基于计算机的测试结果数据集的值

cbs*_*thu 1 r matrix dataset dataframe

我的数据集来自基于计算机的测试,下面给出了一个样本.

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
Run Code Online (Sandbox Code Playgroud)

列表示问题,行表示候选.第一行是答案键.M代表没有答案.我需要替换值,使Ms替换为"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
Run Code Online (Sandbox Code Playgroud)

Replcaing Ms非常简单.

x[x=="M"]<-NA 
Run Code Online (Sandbox Code Playgroud)

但我发现很难在一步中替换其他值.

x<-as.matrix(x) 
Run Code Online (Sandbox Code Playgroud)

转换为矩阵,因为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)
  }}
Run Code Online (Sandbox Code Playgroud)

此for循环仅替换第一列的值.

    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"
Run Code Online (Sandbox Code Playgroud)

如何替换整个数据集?

Rol*_*and 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
Run Code Online (Sandbox Code Playgroud)

请注意,我更正了数据中的拼写错误.