Возьмите строки с определенным количеством повторяющихся значений - PullRequest
0 голосов
/ 13 апреля 2019

В R у меня есть большой фрейм данных, где первые два столбца - это первичный идентификатор (объект) и вторичный идентификатор (элемент объекта).Я хочу создать подмножество этого фрейма данных с условием, что первичный и вторичный идентификаторы должны были повторяться в прежнем фрейме 20 раз.Я также должен повторить этот процесс для других фреймов данных с той же структурой.

Сейчас я сначала подсчитываю, сколько раз каждая пара значений (первичный и вторичный идентификаторы) повторяется в новом фрейме данных, а затемиспользуя цикл for для создания нового кадра данных, но процесс очень медленный и неэффективный: цикл записывает 20 строк в секунду, начиная с кадра данных, в котором содержится от 500 000 до 1 миллиона строк.

for (i in 1:13){
  x <- fread(dataframe_list[i]) #list which contains the dataframes that have to be analyzed
  x1 <- ddply(x,.(Primary_ID,Secondary_ID), nrow) #creating a dataframe which shows how many times a couple of values repeats itself
  x2 <- subset(x1, x1$V1 == 20) #selecting all couples that are repeated for 20 times
  for (n in 1:length(x2$Primary_ID)){
    x3 <- subset(x, (x$Primary_ID == x2$Primary_ID[n]) & (x$Secondary_ID == x2$Secondary_ID[n]))
    outfiles <- paste0("B:/Results/Code_3_", Band[i], ".csv")
    fwrite(x3, file=outfiles, append = TRUE, sep = ",")
  }
}

Как взять, например, все строки из предыдущего кадра данных, которые имеют в качестве значений для первичного и вторичного идентификатора те, которые получены в кадре данных x2 сразу, вместо записи одного набора из 20 строк за раз?Может быть, в SQL проще, но мне сейчас приходится иметь дело с R.

Редактировать:

Конечно.Допустим, я начинаю с такого кадра данных (с другими строками с повторяющимися идентификаторами я просто остановлюсь на 5 строках, чтобы быть короткими):

      Primary ID  Secondary ID  Variable
    1          1             1    0.5729 
    2          1             2    0.6289
    3          1             3    0.3123
    4          2             1    0.4569
    5          2             2    0.7319

Затем с моим кодом я считаю в новомдатафрейм повторяющихся строк (для порогового значения 4 вместо 20, поэтому я могу привести вам краткий пример):

      Primary ID  Secondary ID     Count
    1          1             1         1
    2          1             2         3
    3          1             3         4
    4          2             1         2
    5          2             2         4

Требуемый вывод должен представлять собой такой фрейм данных:

      Primary ID  Secondary ID  Variable
    1          1             3    0.5920
    2          1             3    0.6289
    3          1             3    0.3123
    4          1             3    0.4569
    5          2             2    0.7319
    6          2             2    0.5729
    7          2             2    0.6289
    8          2             2    0.3123

1 Ответ

0 голосов
/ 14 апреля 2019

Если кому-то интересно, мне удалось найти способ. После подсчета с помощью кода выше, сколько раз повторяется пара значений, требуемый вывод можно получить простым способом:

#Select all the couples that are repeated 20 times
x2 <- subset(x1, x1$V1 == 20)
#Create a dataframe which contains the repeated primary and secondary IDs from x2
x3 <- as.data.frame(cbind(x2$Primary_ID, x2$Secondary_ID)
#Wanted output
dataframe <- inner_join(x, x3)

#Joining, by c("Primary_ID", "Secondary_ID")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...