R применять и фильтровать медленно, альтернативы? - PullRequest
1 голос
/ 30 сентября 2019

Я написал функцию 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 строк, я бы хотел немного ускорить это.

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