Возврат строк в датафрейме путем сравнения по столбцу - PullRequest
0 голосов
/ 03 января 2019

У меня есть CSV-файл, который я читаю в R. Данные содержат курсы, которые прошли 3-часовые экзамены за последние 3 года. То, что я пытаюсь сделать, это проверить все текущие курсы и посмотреть, был ли у них 3-часовой экзамен за последние 3 года

данные выглядят так:

courseid    subject catalog first_year  enrollment_more         term
124923      AESTHINT    15      NA          NA                  2188
110744      AESTHINT    24      NA          NA                  2168
122277      AESTHINT    26      NA          NA                  2182
123913      AESTHINT    36      NA          NA                  2162
123913      AESTHINT    36      NA         YES                  2172
127928      AESTHINT    47      NA          NA                  2168
127022      AESTHINT    51      NA          NA                  2178
108455      AESTHINT    55      NA          NA                  2168
109398      AESTHINT    56      NA          NA                  2172
109501      AESTHINT    57      NA          YES                 2178
108950      AESTHINT    58      NA          NA                  2168
108950      AESTHINT    58      NA          NA                  2188
108580      AESTHINT    59      NA          NA                  2168
108580      AESTHINT    59      NA          NA                  2188
122910      AFRAMER     10      NA          YES                 2172
122910      AFRAMER     10      NA          YES                 2182
123435      AFRAMER     197     NA          NA                  2162
123435      AFRAMER     197     NA          NA                  2172
159801      AKKAD       AB      NA          NA                  2172
114298      ANE         102     NA          NA                  2178
203480      ANE         145     NA          NA                  2168
112378      ANTHRO      1010    NA          NA                  2168
112378      ANTHRO      1010    NA          NA                  2178

Ожидаемый результат примерно такой

courseid    subject catalog first_year  enrollment_more         term
108950      AESTHINT    58      NA          NA                  2168
108950      AESTHINT    58      NA          NA                  2188
108580      AESTHINT    59      NA          NA                  2168
108580      AESTHINT    59      NA          NA                  2188

Я загружаю данные и фильтрую по термину (2188 - текущий термин, а остальное - предыдущие термины). Я пробовал match_df, но это дает мне те же результаты, что и current_term

# read the data 
df <- read.csv("my_data.csv", header = TRUE, fileEncoding = "UTF-8-BOM")


# filter all courses with term == 2188
current_term <- filter(df, term == 2188)
current_term

# filter all courses that do not have term == 2188
prior_terms <- filter(df, term %in% c(2182, 2178, 2172, 2168, 2162))
prior_terms

#compare current_term and prior_term on courseid
compare_terms <- match_df(current_term, prior_terms, on="courseid")
compare_terms

Например, AESTHINT 24 не должен быть в моем результате сравнения, потому что у него не было экзамена в семестре 2188

1 Ответ

0 голосов
/ 04 января 2019

Работа в библиотеке 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 на то, что называется вашим файлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...