Работа в библиотеке plyr с match_df
по сути такая же, как и в подмножестве фрейма данных.Давайте прочитаем в CSV-файле вашего примера данных и настроим два фрейма данных.
data <- read.csv("sample.csv")
current_term <- 2188
`%notin%` <- function(x,y) !(x %in% y)
current_classes <- subset(data, data$term %in% current_term)
previous_classes <- subset(data, data$term %notin% current_term)
В вашем случае я собираюсь использовать subset
, потому что для загрузки требуется на один пакет меньше, и в этом примере этовзаимозаменяемы с filter
.Однако, если вы собираетесь выполнять дальнейшие преобразования, используйте очень большие наборы данных или используйте эту функцию в конвейере и загрузите dplyr
, используйте filter
.Кроме того, я установил текущий термин как объект и создал функцию %notin%
, чтобы упростить ее автоматизацию по сравнению с другими терминами.
Теперь, чтобы придерживаться функции match_df
, вам необходимо переписать ее как:
match_df(previous_classes, current_classes, on="courseid")
Первый фрейм данных в функции match_df
- это фрейм данных для поднабора, а второй фрейм данных - это тот, который определяет строки для сопоставления.Я бы просто использовал здесь фильтрацию или поднабор для достижения вашей цели.Кроме того, в ваших выходных данных, если вам нужна строка для каждого класса, которая соответствует вашим критериям как в текущем, так и в любом предыдущем термине, вам придется связать их вместе.
Следующий код даст ответ, которыйвы ищете без необходимости загружать какие-либо пакеты:
data <- read.csv("sample.csv")
current_term <- 2188
`%notin%` <- function(x,y) !(x %in% y)
current_classes <- subset(data, data$term %in% current_term)
previous_classes <- subset(data, data$term %notin% current_term)
dat1 <- subset(previous_classes, previous_classes$courseid %in%
current_classes$courseid)
dat2 <- subset(current_classes, current_classes$courseid %in%
previous_classes$courseid)
final <- rbind(dat1, dat2)
Просто замените имя csv на то, что называется вашим файлом.