Сформировать все возможные комбинации строк в R?

Обновить

December 2018

Просмотры

122 раз

5

Скажем, у меня есть два dataframes, студенты и преподаватели.

students <- data.frame(name = c("John", "Mary", "Sue", "Mark", "Gordy", "Joey", "Marge", "Sheev", "Lisa"),
                   height = c(111, 93, 99, 107, 100, 123, 104, 80, 95),
                   smart = c("no", "no", "yes", "no", "yes", "yes", "no", "yes", "no"))
teachers <- data.frame(name = c("Ben", "Craig", "Mindy"),
                   height = c(130, 101, 105),
                   smart = c("yes", "yes", "yes"))

Я хочу, чтобы генерировать все возможные комбинации студентов и преподавателей и держать сопутствующую информацию, в основном создает все комбинации строк из dataframe «студентов» и «учитель». Это можно легко сделать с петлей и cbind, но для массивного dataframe, это берет навсегда. Помощь в R новичка вне - то, что это самый быстрый способ сделать это?

Edit: Если это не ясно, я хочу, выход иметь следующий формат:

rbind(
  cbind(students[1, ], teachers[1, ]), 
  cbind(students[1, ], teachers[2, ]) 
  ...
  cbind(students[n, ], teachers[n, ]))

3 ответы

2

и держать сопутствующую информацию

Я бы рекомендовал не делать этого. Там нет необходимости иметь все в одном объекте.

Для того, чтобы просто объединить преподавателей и студентов, есть

res = expand.grid(teacher_name = teachers$name, student_name = students$name)

Слить в других данных (которые я бы рекомендовал не делать, пока это необходимо):

res[, paste("teacher", c("height", "smart"), sep="_")] <- 
  teachers[match(res$teacher_name, teachers$name), c("height","smart")]

res[, paste("student", c("height", "smart"), sep="_")] <- 
  students[match(res$student_name, students$name), c("height","smart")]

Это дает

head(res)

  teacher_name student_name teacher_height teacher_smart student_height student_smart
1          Ben         John            130           yes            111            no
2        Craig         John            101           yes            111            no
3        Mindy         John            105           yes            111            no
4          Ben         Mary            130           yes             93            no
5        Craig         Mary            101           yes             93            no
6        Mindy         Mary            105           yes             93            no
0

Вы можете использовать эту функцию

expand.grid.df <- function(...) Reduce(function(...) merge(..., by=NULL), list(...))

expand.grid.df(students,teachers)
2

Вы можете объединить все данные, как показано ниже:

do.call(cbind.data.frame,Map(expand.grid,teacher=teachers,students=students))

   name.teacher name.students height.teacher height.students smart.teacher smart.students
1           Ben          John            130             111           yes             no
2         Craig          John            101             111           yes             no
3         Mindy          John            105             111           yes             no
4           Ben          Mary            130              93           yes             no
5         Craig          Mary            101              93           yes             no
6         Mindy          Mary            105              93           yes             no
:            :            :                :               :            :              :
:            :            :                :               :            :              :