Возьмите строки с определенным количеством повторяющихся значений

В R у меня есть большой фрейм данных, где первые два столбца - это первичный ID (объект) и вторичный ID (элемент объекта). Я хочу создать подмножество этого фрейма данных с условием, что первичный и вторичный ID должны быть повторены в предыдущем фрейме данных 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
      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
", 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


person D.K.    schedule 13.04.2019    source источник
comment
Можете ли вы подготовить небольшой воспроизводимый пример с ожидаемым результатом?   -  person Roman Luštrik    schedule 13.04.2019


Ответы (1)


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

#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")
person D.K.    schedule 14.04.2019