Фильтровать информационный кадр, если пара значений находится в списке списка - PullRequest
0 голосов
/ 05 сентября 2018

Мне нужно отфильтровать данные, связанные с учебной программой студентов.

То, что я ожидаю сделать, это получить все строки где ([curr_code, course] не в комбинациях), где комбинации - это список списка, содержащий все возможные комбинации для удаления.

combinations <- list(
  hydraulics = list(cod = 81017, exp = list("ICH2304", "IMM2003")),
  cience = list(cod = 81016, exp = list("ICH2304")),
  data_science = list(cod = 81015, exp = list("IIC1005"))
)

А вот часть моих данных (exp_data):

id  curr_code  course
1   81017      ICH2304
2   81017      IMM2003
3   81017      IIC1005
4   81016      ICH2304
5   81015      ICH2304
6   81015      IIC1005
7   81015      IBM1005

Я должен получить:

id  curr_code  course
1   81017      IIC1005
2   81015      ICH2304
3   81015      IBM1005

Я пытался использовать:

new_data <- filter(exp_data, !(list.any(combinations, (course %in% exp) && (cod == curr_code))))

Есть идеи?

1 Ответ

0 голосов
/ 05 сентября 2018

Во-первых, работа с combinations в качестве вложенного списка усложнит ситуацию. Лучше, если это возможно, иметь аккуратный data.frame:

comb <- data.frame(name = c('hydraulics','hydraulics','cience','data_science'),
                   cod = c(81017, 81017, 81016, 81015),
                   exp = c("ICH2304", "IMM2003", "ICH2304", "IIC1005"))
comb
          name   cod     exp
1   hydraulics 81017 ICH2304
2   hydraulics 81017 IMM2003
3       cience 81016 ICH2304
4 data_science 81015 IIC1005

Теперь мы можем циклически проходить по вашим exp_data по строкам и сопоставлять значения course и curr_code со значениями в comb. which вернет номер строки, в которой найдено это значение. Взяв intersect из них, вы получите вектор с индексом строки, где оба соответствуют course и curr_code. Если совпадений нет, вы получите пустой вектор.

Поскольку мы ищем строки без совпадений, мы можем просто проверить, является ли length этого вектора == 0, чтобы получить логический вектор, сообщающий, какие строки exp_data не имеют совпадающих строк в comb , Мы можем просто использовать этот вектор для подстановки exp_data, используя квадратные скобки, чтобы получить желаемый результат.

rows_no_match <- apply(exp_data, 1, function(x) {
    length(intersect(which(x[['course']] == comb$exp),
                     which(x[['curr_code']] == comb$cod))) == 0
    })

exp_data[rows_no_match,]
  id curr_code  course
3  3     81017 IIC1005
5  5     81015 ICH2304
7  7     81015 IBM1005
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...