我將使用Roland選擇的「分數」。既然你提到你可以將分數表修改爲2×2的矩陣,我提供了下面的解決方案,與其他2的解決方案有不同的分數數據結構。
讓我解釋一下我的邏輯之前,我爲您提供的代碼:
- 我希望通過排
- 處理DF行對於每一行,我希望用得分每題選擇的答案
- 我想概括起來
基於2,我覺得我可以根據題號&輸入的答覆指數的關聯數組的需要。因此,我創建了以下分數表示法:
> scores <- list(
+ Q1 = list(A1=10,A2=20,A3=30),
+ Q2 = list(B1=30,B2=10,B3=20),
+ Q3 = list(C1=10,C2=30,C3=20)
+ )
基本上,分數現在是列表的列表。通過這樣做,我可以做到以下幾點:
> scores[["Q1"]][["A1"]]
[1] 10
現在我需要做的是找出一種方法進行參數「Q1」 &上述「A1」。
數據幀「DF」如下:
> df
ID Q1 Q2 Q3
1 1 A1 B2 C3
2 2 A2 B1 C2
3 3 A1 B2 C3
我關心的,是沒有ID列的每一行。所以,我只提取是:
> df[1,-1]
Q1 Q2 Q3
1 A1 B2 C3
現在,你可以看到,我需要選擇列名第一個索引得分&行的第二個指數值。因此,如果我能得到分數[[column-M]] [[row-NvalueForColumn-M]],那麼我可以總結它們。
列名容易這樣獲得:
> columnNames <- colnames(df[1,-1])
> columnNames
[1] "Q1" "Q2" "Q3"
所以你的代碼進行必要的邏輯最後一部分是這樣的:
> columnNames <- colnames(df[1,-1])
> score <- c(0,0,0)
> for (i in 1:length(df[1,-1]))
+ {
+ for (j in 1:length(columnNames))
+ {
+ score[i] <- score[i] + scores[[columnNames[j]]][[df[i,-1][[columnNames[j]]]]]
+ }
+ }
> final <- cbind(df,score)
> final
ID Q1 Q2 Q3 score
1 1 A1 B2 C3 40
2 2 A2 B1 C2 80
3 3 A1 B2 C3 40
>
相信可以通過在能夠降低上述代碼至少5行(使用rowsums等)。我確信像Sven這樣的經驗豐富的人可以將上面的代碼改進爲一些漂亮的代碼。將不勝感激輸入。