У меня есть вложенный список
combine <- list(c('A', 'B', 'C'), c('D', 'H', 'G', 'J'), c('A', 'E'))
и df
df <- data.frame(appln_id = c(1, 1, 2, 2, 4, 4, 4, 3, 3, 3, 3, 5, 9, 9),
prior_year = c(1997,1997,1997,1997,1997,1997,1997,1998,1998,1998,1998,2000,2000,2000),
IPC = c('B','E','E','B','H','J','D','H','J','D','E','A','E','B'))
Я хочу агрегировать IPC
в соответствии с appln_id
(например: for appln_id=1: c('B','E')
, for appln_id=2: c('E','B')
, for appln_id=4: c('H','J','D')
, и т. Д. c.). Затем для каждого значения prior_year
я хочу сравнить наборы IPC
с элементами списка combine
.
Для набора IPC
, который не является подмножеством какого-либо элемента combine
, Я хочу сохранить его данные в df
в другом фрейме данных с именем new
следующим образом:
new <- data.frame(appln_id = c(1, 1, 3, 3, 3, 3),
prior_year = c(1997,1997,1998,1998,1998,1998),
IPC = c('B','E','H','J','D','E'))
и добавить этот IPC
набор в combine
следующим образом:
combine <- list(c('A', 'B', 'C'), c('D', 'H', 'G', 'J'), c('A', 'E'), c('B', 'E'), c('D','E','J','H'))
Это мой код:
new <- data.frame(appln_id=integer(),prio_year=integer(), IPC=character())
new_combine=list()
prio_year <- unique(df$prio_year)
appln_id <- unique(df$appln_id)
for (i in prio_year){
for (j in appln_id){
x <- sort((df[(df$prio_year==i) & (df$appln_id==j),3])[[1]])
for (k in combine){
if (all(x %in% k) == FALSE){
new <- rbind(new, df[df$appln_id==j,])
new_combine[[length(new_combine)+1]] <- x
}
}
}
combine <- c(combine,unique(new_combine))
}
Однако выполнение моего кода занимает слишком много времени. Может ли кто-нибудь другой способ сделать это быстрее? Спасибо.