2016-07-21 5 views
0

私は教師の評価を持つデータセットを扱っています。一部の生徒は同じ教師を2回以上評価しました。二回だけ1等級を維持重複したIDSからランダムな行を選択

1)任意のユニークな学生のIdsを維持し、生徒が教師を評価ケースで評価

2):私は、データをどうしたい何 は、以下の基準でそれをサブセットすることですランダムに保持するレーティングを選択することができます。

3)可能であれば、すべての解析ファイルの先頭にあるスクリプトでコードを実行し、作成されたデータセットが解析ごとに同じであることを確認します(シードを設定しますか?)。

# data 
student.id <- c(1,1,2,3,3,4,5,6,7,7,7,8,9) 
teacher.id <- c(1,1,1,1,1,2,2,2,2,2,2,2,2) 
rating <- c(100,99,89,100,99,87,24,52,100,99,89,79,12) 
df <- data.frame(student.id,teacher.id,rating) 

今後の進め方についてのお問い合わせありがとうございます。

答えて

1

各student.idが1人の教師にのみ適用されると仮定すると、次の方法を使用できます。

# get a list containing data.frames for each student 
myList <- split(df, df$student.id) 

# take a sample of each data.frame if more than one observation or the single observation 
# bind the result together into a data.frame 
set.seed(1234) 
do.call(rbind, lapply(myList, function(x) if(nrow(x) > 1) x[sample(nrow(x), 1), ] else x)) 

これは、

student.id teacher.id rating 
1   1   1 100 
2   2   1  89 
3   3   1  99 
4   4   2  87 
5   5   2  24 
6   6   2  52 
7   7   2  99 
8   8   2  79 
9   9   2  12 

同じstudent.id率であれば、複数の教師を返し、このメソッドはinteraction機能を備えた新しい変数の構築を必要とする:

# create new interaction variable 
df$stud.teach <- interaction(df$student.id, df$teacher.id) 

myList <- split(df, df$stud.teach) 

の場合、コードの残りは上記と同じです。


潜在的に速い方法はdata.tableライブラリとrbindlistを使用することです。

library(data.table) 
# convert into a data.table 
setDT(df) 

myList <- split(df, df$stud.teach) 

# put together data.frame with rbindlist 
rbindlist(lapply(myList, function(x) if(nrow(x) > 1) x[sample(nrow(x), 1), ] else x)) 
+1

複数の教師に評価された場合の変化は?私は自分のデータを更新することができます。 – bfoste01

+1

スプリットは、教師と学生IDとのやり取りを行う変数上になければなりません。私の更新された答えを見てください。 – lmo

+0

すばらしい。それはたくさんの助けになります!コードを高速化する方法はありますか?私は100,000 IDSを持っているので、最終的なdo.callの解決策に収束するのはかなり遅いか、それとも速いですか? – bfoste01

関連する問題