2016-07-21 2 views
0

나는 교사의 학생 평가가있는 데이터 세트를 다루고 있습니다. 어떤 학생들은 같은 교사를 두 번 이상 평가했습니다. 두 번 만 1 등급을 유지중복 IDS에서 무작위로 행 선택

1) 고유 학생 ID를 유지하고 학생들이 교사를 평가의 경우 평가

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가 한 교사에게만 적용된다고 가정하면 다음 방법을 사용할 수 있습니다.

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

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

# 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 기능을 가진 새로운 변수의 건설을 필요로 반환

코드의 나머지는 위의 코드와 동일합니다.


잠재적 빠른 방법은 data.tablerbindlist 라이브러리를 사용하는 것이다.

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

환상적. 그게 많은 도움이됩니다! 코드를 빠르게 할 수있는 방법이 있습니까? IDS가 10 만개이므로 최종 do.call의 솔루션에 수렴하는 것이 매우 느리거나 빠르게 진행됩니다. – bfoste01