Я написал функцию apply для обработки кадра данных. Я пытаюсь пройтись, посмотреть каждую комбинацию значений в столбцах «first» и «second» и убедиться, что у меня еще нет такой строки («second», «first»). Однако функция, которую я написал для этого, занимает много времени. Я считаю, что проблема заключается в том, что я создаю подмножество данных, используя dplyr 'filter'. Я довольно новичок в этой работе и не совсем уверен, как я могу ускорить ее. Любые предложения будут великолепны!
Я использую это на своем персональном компьютере, который имеет 6 ГБ ОЗУ и процессор с частотой 2,20 ГГц. Фрейм данных - это 6939380 obs из 7 переменных. Вот подмножество моих данных.
first <- c("Q1","Q2","Q3","Q4","Q5")
second <- c("Q6","Q7","Q8","Q9","Q10")
third_Q <- c("Q11","Q12","Q13","Q14","Q15")
third_filter <- c("yes","yes","no","yes","maybe")
combo1 <- c("Q1_-_Q6","Q2_-_Q7","Q3_-_Q8","Q4_-_Q9","Q5_-_Q10")
combo2 <- c("Q6_-_Q1","Q7_-_Q2","Q8_-_Q3","Q9_-_Q4","Q10_-_Q5")
row <- c(1,2,3,4,5)
temp2 <- data.frame(first,second,third_Q,third_filter,combo1,combo2,row)
Это функция, которую я написал и пытаюсь запустить на этом фрейме данных.
fun3 <- function(x){
#print the row # you are working on
print(paste("row",as.numeric(x['row'],sep="_")))
#get the row number you are looking for, the 3rd question, the 3rd filter, and the combo of questions you are asking
rownum <- as.numeric(x['row'])
q3 <- as.character(x['third_Q'])
q3_filter <- as.character(x['third_filter'])
combo <- as.character(x['combo1'])
#subset the data to only look at rows that are above the row number you are analyzing, and the 3rd question & filter you are asking
su <- (temp2 %>% filter(row<rownum & third_Q==q3 & third_filter==q3_filter))$combo2
#compare the combo of the row you are working on to the 'combo2' for all of the rows in your subset
result <- ifelse(combo %in% su,"discard","keep")
return(result)
}
temp2$keep2 <- apply(temp2,1,fun3)
Я использую "печать ... .. "часть функции, чтобы наблюдать, как быстро работает моя функция. Вывод довольно медленный (он будет печатать новый номер строки каждые ~ 2 секунды). Учитывая, что у меня 6 939 380 строк, я бы хотел немного ускорить это.