[R-es] Crear datos aleatorios con restriciones

Ignacio Martinez ignacio82 en gmail.com
Mar Jul 14 19:23:17 CEST 2015


Este codigo resuelve mi problema. Estoy usando `str_split` y como separador
'- '. Tambien tengo que usar 'trimws'. Supongo que se podria limpiar el
codigo para hacerlo mas eficiente, pero todavia no se me ocurrio como. *Muchas
gracias  Carlos!*


library(dplyr)
library(randomNames)
library(geosphere)
set.seed(7142015)
# Define Parameters
n.Schools <- 20
first.grade<-3
last.grade<-5
n.Grades <-last.grade-first.grade+1
n.Classrooms <- 4
n.Teachers <- (n.Schools*n.Grades*n.Classrooms)/2 #Two classrooms per
teacher

# Define Random names function:
gen.names <- function(n, which.names = "both", name.order = "last.first"){
  names <- unique(randomNames(n=n, which.names = which.names, name.order =
name.order))
  need <- n - length(names)
  while(need>0){
    names <- unique(c(randomNames(n=need, which.names = which.names,
name.order = name.order), names))
    need <- n - length(names)
  }
  return(names)
}

# Generate n.Schools names
gen.schools <- function(n.schools) {
  School.ID <-
    paste0(gen.names(n = n.schools, which.names = "last"), ' School')
  School.long <- rnorm(n = n.schools, mean = 21.7672, sd = 0.025)
  School.lat <- rnorm(n = n.schools, mean = 58.8471, sd = 0.025)
  School.RE <- rnorm(n = n.schools, mean = 0, sd = 1)
  Schools <-
    data.frame(School.ID, School.lat, School.long, School.RE) %>%
    mutate(School.ID = as.character(School.ID)) %>%
    rowwise() %>%  mutate (School.distance = distHaversine(
      p1 = c(School.long, School.lat),
      p2 = c(21.7672, 58.8471), r = 3961
    ))
  return(Schools)
}

Schools <- gen.schools(n.schools = n.Schools)

# Generate Grades
Grades <- c(first.grade:last.grade)

# Generate n.Classrooms

Classrooms <- LETTERS[1:n.Classrooms]

# Group schools and grades

SchGr <- outer(paste0(Schools$School.ID, '-'), paste0(Grades, '-'),
FUN="paste")
#head(SchGr)

# Group SchGr and Classrooms

SchGrClss <- outer(SchGr, paste0(Classrooms, '-'), FUN="paste")
#head(SchGrClss)

# These are the combination of  School-Grades-Classroom
SchGrClssTmp <- as.matrix(SchGrClss, ncol=1, nrow=length(SchGrClss) )
SchGrClssEnd <- as.data.frame(SchGrClssTmp)

# Assign n.Teachers (2 classroom in a given school-grade)
Allpairs <- as.data.frame(t(combn(SchGrClssTmp, 2)))
AllpairsTmp <- paste(Allpairs$V1, Allpairs$V2, sep=" ")

library(stringr)
separoPairs <- as.data.frame(str_split(string = AllpairsTmp, pattern = "-"))
separoPairs <- as.data.frame(t(separoPairs))
row.names(separoPairs) <- NULL
separoPairs <- separoPairs %>% select(-V7)  %>%  #Drops empty column
  mutate(V1=as.character(V1), V4=as.character(V4), V2=as.numeric(V2),
V5=as.numeric(V5)) %>% mutate(V4 = trimws(V4, which = "both"))

separoPairs[120,]$V4
#Only the rows with V1=V4 and V2=V5 are valid
validPairs <- separoPairs %>% filter(V1==V4 & V2==V5) %>% select(V1, V2,
V3, V6)

# Generate n.Teachers

gen.teachers <- function(n.teachers){
  Teacher.ID <- gen.names(n = n.teachers, name.order = "last.first")
  Teacher.exp <- runif(n = n.teachers, min = 1, max = 30)
  Teacher.Other <- sample(c(0,1), replace = T, prob = c(0.5, 0.5), size =
n.teachers)
  Teacher.RE <- rnorm(n = n.teachers, mean = 0, sd = 1)
  Teachers <- data.frame(Teacher.ID, Teacher.exp, Teacher.Other, Teacher.RE)
  return(Teachers)
}
Teachers <- gen.teachers(n.teachers = n.Teachers) %>%
  mutate(Teacher.ID = as.character(Teacher.ID))

# Randomly assign n.Teachers teachers to the "ValidPairs"
TmpAssignments <- validPairs[sample(1:nrow(validPairs), n.Teachers), ]
Assignments <- cbind.data.frame(Teachers$Teacher.ID, TmpAssignments)
names(Assignments) <- c("Teacher.ID", "School.ID", "Grade", "Class_1",
"Class_2")

# Tidy Data
library(tidyr)
TeacherClassroom <- Assignments %>%
  gather(x, Classroom, Class_1,Class_2) %>%
  select(-x) %>%
  mutate(Teacher.ID = as.character(Teacher.ID))

# Merge
DF_Classrooms <- TeacherClassroom %>% full_join(Teachers, by="Teacher.ID")
%>% full_join(Schools, by="School.ID")

On Tue, Jul 14, 2015 at 10:35 AM Ignacio Martinez <ignacio82 en gmail.com>
wrote:

> Genial Carlos! Tu codigo produce lo que quiero!
>
> Estoy tratando de entender cada paso y hacer algunos cambios. Mi problema
> es con como usar `str_plit_fixed`. Con tu codigo tengo eso:
>
> > separoPairs <- as.data.frame(str_split_fixed(AllpairsTmp, " ", 6))
>
> head(separoPairs)
>
>   V1 V2 V3 V4 V5 V6
> 1 e1 g1 c1 e2 g1 c1
> 2 e1 g1 c1 e3 g1 c1
> 3 e1 g1 c1 e4 g1 c1
> 4 e1 g1 c1 e5 g1 c1
> 5 e1 g1 c1 e6 g1 c1
> 6 e1 g1 c1 e7 g1 c1
>
>
> V1 y V4 son el nombre de las escuelas, V2 y V5 del grado y V3 y V6 de la
> division. Yo hice unos cambios para tener datos un poco mas complejos, pero
> como resultado inintencional no puedo producir `separoPairs` Esto es lo que
> mi codigo produce:
>
> > head(separoPairs)      V1     V2 V3    V4 V5                         V6
> 1 Aslamy School  3 grade  A  Maruyama School 3 grade A
> 2 Aslamy School  3 grade  A     Smith School 3 grade A
> 3 Aslamy School  3 grade  A   Linares School 3 grade A
> 4 Aslamy School  3 grade  A   Dieyleh School 3 grade A
> 5 Aslamy School  3 grade  A Hernandez School 3 grade A
> 6 Aslamy School  3 grade  A   Padgett School 3 grade A
>
>
> Se puede arreglar? Este es mi codigo
>
> library(dplyr)
> library(randomNames)
> library(geosphere)
> set.seed(7142015)
> # Define Parameters
> n.Schools <- 20
> first.grade<-3
> last.grade<-5
> n.Grades <-last.grade-first.grade+1
> n.Classrooms <- 4
> n.Teachers <- (n.Schools*n.Grades*n.Classrooms)/2 #Two classrooms per
> teacher
>
> # Define Random names function:
> gen.names <- function(n, which.names = "both", name.order = "last.first"){
>   names <- unique(randomNames(n=n, which.names = which.names, name.order =
> name.order))
>   need <- n - length(names)
>   while(need>0){
>     names <- unique(c(randomNames(n=need, which.names = which.names,
> name.order = name.order), names))
>     need <- n - length(names)
>   }
>   return(names)
> }
>
> # Generate n.Schools names
> gen.schools <- function(n.schools) {
>   School.ID <-
>     paste0(gen.names(n = n.schools, which.names = "last"), ' School')
>   School.long <- rnorm(n = n.schools, mean = 21.7672, sd = 0.025)
>   School.lat <- rnorm(n = n.schools, mean = 58.8471, sd = 0.025)
>   School.RE <- rnorm(n = n.schools, mean = 0, sd = 1)
>   Schools <-
>     data.frame(School.ID, School.lat, School.long, School.RE) %>%
>     mutate(School.ID = as.character(School.ID)) %>%
>     rowwise() %>%  mutate (School.distance = distHaversine(
>       p1 = c(School.long, School.lat),
>       p2 = c(21.7672, 58.8471), r = 3961
>     ))
>   return(Schools)
> }
>
> Schools <- gen.schools(n.schools = n.Schools)
>
> # Generate Grades
> Grades <- c(first.grade:last.grade)
>
> # Generate n.Classrooms
>
> Classrooms <- LETTERS[1:n.Classrooms]
>
> # Group schools and grades
>
> SchGr <- outer(Schools$School.ID, Grades, 'grade', FUN="paste")
>
>
> # Group SchGr and Classrooms
>
> SchGrClss <- outer(SchGr, Classrooms, FUN="paste")
>
> # These are the combination of  School-Grades-Classroom
> SchGrClssTmp <- as.matrix(SchGrClss, ncol=1, nrow=length(SchGrClss) )
> SchGrClssEnd <- as.data.frame(SchGrClssTmp)
>
> # Assign n.Teachers (2 classroom in a given school-grade)
> Allpairs <- as.data.frame(t(combn(SchGrClssTmp, 2)))
> AllpairsTmp <- paste(Allpairs$V1, Allpairs$V2, sep=" ")
>
> library(stringr)
> separoPairs <- as.data.frame(str_split_fixed(AllpairsTmp, " ", 6))
> head(separoPairs)
>
> Muchas gracias! Estoy aprendiendo un monto gracias a vos!
>
> Ignacio
>
>
>
>
>
> On Tue, Jul 14, 2015 at 3:31 AM Carlos Ortega <cof en qualityexcellence.es>
> wrote:
>
>> OK.
>> Bueno, para esa última parte para tener un data.frame con toda la
>> información, ya filtrada y con los datos de los profesores puedes hacer
>> esto:
>>
>> #------------------------------------------
>>
>> #Si a los "validPairs" tengo que asignar "T" profesores
>> t <- 10
>> teachers <- data.frame(
>>                        Name=sample(paste("Prof_",1:t, sep=""),t)
>>                       ,Speciality=sample(paste("Spec_",1:t, sep=""),t)
>>                       ,Age=sample(25:60,t)
>>                       )
>>
>> placesEnd <- validPairs[sample(1:nrow(validPairs), t), ]
>> row.names(placesEnd) <- NULL
>> placesEndRed <- placesEnd[,c(1,2,3,6)]
>> names(placesEndRed) <- c("School", "Grade", "Class_1", "Class_2")
>> endAssig <- cbind.data.frame(placesEndRed, teachers)
>> endAssig
>>
>> #------------------------------------------
>>
>> Que produce este tipo de resultado:
>>
>> > endAssig
>>    School Grade Class_1 Class_2    Name Speciality Age
>> 1     e11    g2      c3     c18  Prof_2     Spec_5  39
>> 2     e11    g2      c5     c16  Prof_8     Spec_1  49
>> 3     e12    g1      c3     c17  Prof_1    Spec_10  36
>> 4      e2    g2     c15     c17 Prof_10     Spec_9  29
>> 5      e1    g3      c9     c15  Prof_3     Spec_6  55
>> 6      e6    g3      c2     c18  Prof_6     Spec_8  42
>> 7     e17    g2      c9     c14  Prof_4     Spec_3  27
>> 8     e18    g3      c2     c12  Prof_7     Spec_2  53
>> 9     e13    g1     c10     c20  Prof_9     Spec_4  58
>> 10    e18    g2      c4     c19  Prof_5     Spec_7  59
>>
>> Saludos,
>> Carlos Ortega
>> www.qualityexcellence.es
>>
>>
>> El 14 de julio de 2015, 1:00, Ignacio Martinez <ignacio82 en gmail.com>
>> escribió:
>>
>>> Perdon por no se lo suficientemente claro :(
>>>
>>> Tu codigo produce `validPairs` que tiene 7 variables y 360
>>> observaciones. Donde
>>>
>>> > validPairs[1,]   V1 V2 V3 V4 V5 V6 valid
>>> 60 e1 g1 c1 e1 g1 c2 Valid
>>>
>>>
>>> indica que un maestro tiene asignado c1 y c2 en la escuela e1 y el grado
>>> g1. Correcto? Si es asi, esto es casi lo que queira producir y creo que
>>> puedo llegar a donde quiero usando tu codigo de base.
>>>
>>> El objecto que yo quiero generar es el que genero en stakoverflow
>>> `schoolGrade`. Donde
>>>
>>> > schoolGrade[1:2,]  grade   School.ID Classroom       Teacher.ID Teacher.exp Teacher.Other  Teacher.RE
>>> 1     3 Modi School         A    Sage, Kendell    27.87402             0 -0.04372723
>>> 2     4 Modi School         A Delgado, Vanessa    26.20701             0 -0.88280564
>>>
>>>
>>> Es decir, cada observación es un aula en una escuela con informacion
>>> sobre el grado, nombre del maestro, otras caracteristics del maestro.
>>>
>>> Muchas gracias por la ayuda.
>>>
>>>
>>>
>>> On Mon, Jul 13, 2015 at 6:37 PM Carlos Ortega <cof en qualityexcellence.es>
>>> wrote:
>>>
>>>> Hola,
>>>>
>>>> No entiendo muy bien.
>>>> El número de clases lo puedes modificar a tu gusto, en la variable
>>>> "numDi".
>>>>
>>>> He puesto un valor de ejemplo de 4 porque así aparecía en tu código,
>>>> obviamente puedes poner otro valor...
>>>> La única limitación aparecerá cuando escojas un valor muy grande y el
>>>> cálculo de las combinaciones posibles tarde en generarse. He probadoc con
>>>> 20 y sigue siendo manejable.
>>>>
>>>> #---------------------------------------------
>>>>
>>>> #Generar "c" Divisiones: c1, c2, c3...
>>>> *numDi <- 4*
>>>> divis <- paste("c", 1:numDi, sep="")
>>>> #----------------------------------------------
>>>>
>>>> Y la otra discrepancia parece ser el número de combinaciones válidas.
>>>> Lo que has dicho es que quieres "asignar un profesor a una escuela un
>>>> grado y dos clases". Dos clases, del mismo colegio y en el mismo grado, ¿es
>>>> así?...
>>>>
>>>> Saludos,
>>>> Carlos Ortega
>>>> www.qualityexcellence.es
>>>>
>>>>
>>>>
>>>> El 14 de julio de 2015, 0:07, Ignacio Martinez <ignacio82 en gmail.com>
>>>> escribió:
>>>>
>>>>> Gracias Carlos,
>>>>>
>>>>> Tu codigo es un gran paso en el sentido correcto pero no produce
>>>>> exactamente lo que estoy buscando.
>>>>>
>>>>> Mi "solucion" en stackoverflow
>>>>> <http://stackoverflow.com/questions/31137940/randomly-assign-teachers-to-classrooms-imposing-restrictions/31143808#31143808>
>>>>> produce un data frame `schoolGrade` con 240 observaciones y 7 variables. Mi
>>>>> objetivo es poder generar un data frame asi pero con la flexibilidad de
>>>>> poder usar n.classrooms <- 20 (o cualquier otro numero) en lugar de 4
>>>>> (hardcoded)
>>>>>
>>>>> Gracias de nuevo!
>>>>>
>>>>> Ignacio
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Mon, Jul 13, 2015 at 5:54 PM Carlos Ortega <
>>>>> cof en qualityexcellence.es> wrote:
>>>>>
>>>>>> Hola,
>>>>>>
>>>>>> Esta es una forma de hacerlo, evitando bucles....
>>>>>>
>>>>>>
>>>>>> #------------------------------------------------------------------------------------------
>>>>>> #1. Quiero generar N escuelas, con G grados y C divisiones.
>>>>>> #2. Quiero asignar cada uno de T maestros a 2 divisiones en un grado
>>>>>> y escuela
>>>>>>
>>>>>> #---------------------- Combinaciones de: Escuelas - Grados -
>>>>>> Divisiones
>>>>>> #Generar "n" Escuelas: e1, e2, e3...
>>>>>> numEs <- 20
>>>>>> escuelas <- paste("e", 1:numEs, sep="")
>>>>>>
>>>>>> #Generar "g" Grados: g1, g2, g3...
>>>>>> numGr <- 3
>>>>>> grados <- paste("g", 1:numGr, sep="")
>>>>>>
>>>>>> #Generar "c" Divisiones: c1, c2, c3...
>>>>>> numDi <- 4
>>>>>> divis <- paste("c", 1:numDi, sep="")
>>>>>>
>>>>>>
>>>>>> #Agrupo Escuelas - Grados
>>>>>> EsGra <- outer(escuelas, grados, FUN="paste")
>>>>>>
>>>>>> #Agrupo (Escuelas - Grados) - Divisiones
>>>>>> EsGraDiv <- outer(EsGra, divis, FUN="paste")
>>>>>>
>>>>>> #Estas son todas las combinaciones de Escuelas-Grados-Divisiones
>>>>>> EsGraDivTmp <- as.matrix(EsGraDiv, ncol=1, nrow=length(EsGraDiv) )
>>>>>> EsGraDivEnd <- as.data.frame(EsGraDivTmp)
>>>>>>
>>>>>> #---------------------- Profesores
>>>>>> #Asignar a cada uno de los T maestros a 2 clases en 1 grado y 1
>>>>>> escuela
>>>>>> #Al ser 2 clases creo todas las parejas posibles
>>>>>> #de las que escogeré 2 clases del mismo grado y misma escuela
>>>>>> Allpairs <- as.data.frame(t(combn(EsGraDivTmp, 2)))
>>>>>> AllpairsTmp <- paste(Allpairs$V1, Allpairs$V2, sep=" ")
>>>>>>
>>>>>> #Aqui tengo las parejas en la misma fila y separadas en columnas
>>>>>> library(stringr)
>>>>>> separoPairs <- as.data.frame(str_split_fixed(AllpairsTmp, " ", 6))
>>>>>>
>>>>>> #de este data.frame escojo filas donde V1=V4 y V2=V5 : misma escuela
>>>>>> + mismo grado
>>>>>> separoPairs$valid <- ifelse(separoPairs$V1 == separoPairs$V4 &
>>>>>> separoPairs$V2 == separoPairs$V5, "Valid", "Invalid")
>>>>>>
>>>>>> #Resultado Final
>>>>>> validPairs <- separoPairs[separoPairs$valid=="Valid",]
>>>>>>
>>>>>> #Si a los "validPairs" tengo que asignar "T" profesores, de forma
>>>>>> aleatoria
>>>>>> t <- 10
>>>>>> validPairs[sample(1:nrow(validPairs), t), ]
>>>>>>
>>>>>> #---------------------------------------------------------
>>>>>>
>>>>>> Saludos,
>>>>>> Carlos Ortega
>>>>>> www.qualityexcellence.es
>>>>>>
>>>>>>
>>>>>> El 13 de julio de 2015, 21:03, Ignacio Martinez <ignacio82 en gmail.com>
>>>>>> escribió:
>>>>>>
>>>>>>> Hola,
>>>>>>>
>>>>>>> 0. La falta de 'elegancia' hace que sea mas dificil hacer cambios al
>>>>>>> codigo. Por ejemplo cambiar n.classrooms <- 4 a n.classrooms <- 20
>>>>>>>
>>>>>>> 1. Cuando tengo solo 4 puedo hacer esto:
>>>>>>>
>>>>>>> schoolGrade$A <- Teachers$Teacher.ID[1:cuttoff1]
>>>>>>> schoolGrade$B <- Teachers$Teacher.ID[1:cuttoff1]
>>>>>>> schoolGrade$C <- Teachers$Teacher.ID[(cuttoff1+1):n.teachers]
>>>>>>> schoolGrade$D <- Teachers$Teacher.ID[(cuttoff1+1):n.teachers]
>>>>>>>
>>>>>>> Pero si tengo 20 tendria que escribir 20 lines en lugar de 4 y
>>>>>>> calcular los cutoff para cada linea. Con 20 classrooms por escuela y por
>>>>>>> grado tengo que asignar 600 maestros a 2 classrooms cada uno.
>>>>>>>
>>>>>>> 2. No necesito todas las asignaciones posible, con una es
>>>>>>> suficiente.
>>>>>>>
>>>>>>> Gracias!
>>>>>>>
>>>>>>> On Mon, Jul 13, 2015 at 2:54 PM Carlos Ortega <
>>>>>>> cof en qualityexcellence.es> wrote:
>>>>>>>
>>>>>>>> Hola,
>>>>>>>>
>>>>>>>> ¿Pero el problema que tienes es de "elegancia del código" como
>>>>>>>> indicas en StackOverflow?
>>>>>>>> o ¿de performance porque al subir el número de clases el número
>>>>>>>> total de combinaciones te explota?...
>>>>>>>>
>>>>>>>> En cuanto a las asignaciones de los profesores, ¿quieres tener
>>>>>>>> todas las posibles asignaciones? ¿un solo caso de asignación?...
>>>>>>>>
>>>>>>>> Saludos,
>>>>>>>> Carlos Ortega
>>>>>>>> www.qualityexcellence.es
>>>>>>>>
>>>>>>>> 2015-07-13 15:23 GMT+02:00 Ignacio Martinez <ignacio82 en gmail.com>:
>>>>>>>>
>>>>>>>>> Hola,
>>>>>>>>>
>>>>>>>>> Esta pregunta la hice en stackoverflow
>>>>>>>>>
>>>>>>>> <
>>>>>>>>> http://stackoverflow.com/questions/31137940/randomly-assign-teachers-to-classrooms-imposing-restrictions/31143808#31143808
>>>>>>>>> >pero
>>>>>>>>
>>>>>>>>
>>>>>>>>> nadie pudo contestarla.
>>>>>>>>>
>>>>>>>>> 1. Quiero generar N escuelas, con G grados y C divisiones.
>>>>>>>>> 2. Quiero asignar cada uno de T maestros a 2 divisiones en un
>>>>>>>>> grado y
>>>>>>>>> escuela
>>>>>>>>>
>>>>>>>>> Si tengo C=4 divisiones, puedo lograr lo que quiero con este
>>>>>>>>> código:
>>>>>>>>>
>>>>>>>>> library(randomNames)
>>>>>>>>> set.seed(6232015)
>>>>>>>>> n.schools <-20
>>>>>>>>> n.grades <- 3
>>>>>>>>> n.classrooms <- 4
>>>>>>>>> total.classrooms <- n.classrooms*n.grades*n.schools
>>>>>>>>>
>>>>>>>>> gen.names <- function(n, which.names = "both", name.order =
>>>>>>>>> "last.first"){
>>>>>>>>>   names <- unique(randomNames(n=n, which.names = which.names,
>>>>>>>>> name.order = name.order))
>>>>>>>>>   need <- n - length(names)
>>>>>>>>>   while(need>0){
>>>>>>>>>     names <- unique(c(randomNames(n=need, which.names =
>>>>>>>>> which.names,
>>>>>>>>> name.order = name.order), names))
>>>>>>>>>     need <- n - length(names)
>>>>>>>>>   }
>>>>>>>>>   return(names)}
>>>>>>>>> #Generates teachers data frame
>>>>>>>>> n.teachers=total.classrooms/2
>>>>>>>>> gen.teachers <- function(n.teachers){
>>>>>>>>>   Teacher.ID <- gen.names(n = n.teachers, name.order =
>>>>>>>>> "last.first")
>>>>>>>>>   Teacher.exp <- runif(n = n.teachers, min = 1, max = 30)
>>>>>>>>>   Teacher.Other <- sample(c(0,1), replace = T, prob = c(0.5, 0.5),
>>>>>>>>> size = n.teachers)
>>>>>>>>>   Teacher.RE <- rnorm(n = n.teachers, mean = 0, sd = 1)
>>>>>>>>>   Teachers <- data.frame(Teacher.ID, Teacher.exp, Teacher.Other,
>>>>>>>>> Teacher.RE) %>% mutate(Teacher.ID=as.character(Teacher.ID))
>>>>>>>>>   return(Teachers)}
>>>>>>>>> Teachers <- gen.teachers(n.teachers = n.teachers)
>>>>>>>>> str(Teachers$Teacher.ID)
>>>>>>>>> #Make a ‘schoolGrade’ object and then reshape
>>>>>>>>>
>>>>>>>>> schoolGrade <- expand.grid(grade = c(3,4,5),
>>>>>>>>>                            School.ID = paste0(gen.names(n =
>>>>>>>>> n.schools,
>>>>>>>>> which.names = "last"),
>>>>>>>>>                                               ' School'))
>>>>>>>>> # assign each of T teachers to 2 classrooms within a single school
>>>>>>>>> and grade
>>>>>>>>> cuttoff1<-n.teachers/2
>>>>>>>>> schoolGrade$A <- Teachers$Teacher.ID[1:cuttoff1]
>>>>>>>>> schoolGrade$B <- Teachers$Teacher.ID[1:cuttoff1]
>>>>>>>>> schoolGrade$C <- Teachers$Teacher.ID[(cuttoff1+1):n.teachers]
>>>>>>>>> schoolGrade$D <- Teachers$Teacher.ID[(cuttoff1+1):n.teachers]
>>>>>>>>>
>>>>>>>>> library(tidyr)
>>>>>>>>> schoolGrade <- gather(schoolGrade, Classroom, Teacher.ID, A:D) %>%
>>>>>>>>> full_join(Teachers, by="Teacher.ID")
>>>>>>>>>
>>>>>>>>> El problema es si quiero incrementar n.classroom incrementar de 4
>>>>>>>>> a 20 (en
>>>>>>>>> lugar de A a D tener de A a T
>>>>>>>>>
>>>>>>>>> Gracias por la ayuda!
>>>>>>>>>
>>>>>>>>>         [[alternative HTML version deleted]]
>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> R-help-es mailing list
>>>>>>>>> R-help-es en r-project.org
>>>>>>>>> https://stat.ethz.ch/mailman/listinfo/r-help-es
>>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>>
>>>>>>>> --
>>>>>>>> Saludos,
>>>>>>>> Carlos Ortega
>>>>>>>> www.qualityexcellence.es
>>>>>>>>
>>>>>>>
>>>>>>
>>>>>>
>>>>>> --
>>>>>> Saludos,
>>>>>> Carlos Ortega
>>>>>> www.qualityexcellence.es
>>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> Saludos,
>>>> Carlos Ortega
>>>> www.qualityexcellence.es
>>>>
>>>
>>
>>
>> --
>> Saludos,
>> Carlos Ortega
>> www.qualityexcellence.es
>>
>

	[[alternative HTML version deleted]]



Más información sobre la lista de distribución R-help-es