Найти число вхождений набора из двух столбцов фрейма данных в другие фреймы данных в r

У меня 103 фрейма данных с 7 переменными и более 1000 строк. Я хочу найти количество вхождений пары из двух столбцов одного фрейма данных в другие 102 фрейма данных. Другими словами, сколько раз c(V1,V2) вместе (= два столбца кадра данных вместе) можно увидеть в других 102 кадрах данных.

Я уже написал код, но он очень медленный!

Я поместил все 103 фрейма данных в список и преобразовал их в фрейм данных. Затем создайте цикл for, чтобы прочитать каждый кадр данных один за другим. и в каждом цикле у меня есть другой цикл for для поиска каждой строки фрейма данных в этом списке!

Основная часть кодов выглядит следующим образом:

    for(i in file){
         input<-read.table(i)

         for(j in 1:1000){
            df1<- data.table(input[j,c(1,3)]) 
            count<-merge(df1,dt, c("V1", "V3")) //dt is a data frame includes all 103 data frames
            df1["count"]<-nrow(count)
       }
    }

Таким образом, я могу подсчитать, сколько раз набор V1 и V3 фрейма данных входит в другие фреймы данных. Но для получения полного результата требуется более 50 дней!

Интересно, сможет ли кто-нибудь помочь мне быстрее получить желаемые результаты?


Пример фрейма данных (здесь рассматривается только 5 переменных):

 V1    V2  V3   V4  V5 
 1     Q0  abc  34  3
 1     Q0  abd  31  9
 1     Q0  bac  32  3
 1     Q0  cba  56  0
 2     Q0  zxc  37  3
 2     Q0  fgc  30  3
 2     Q0  ghc  36  3

На самом деле, я хочу узнать, сколько раз каждое значение V3 входит в другие кадры данных, но потому что V3 и V1 являются зависимыми. Я должен рассмотреть V1 в моем поиске также. Итак, я должен увидеть, сколько раз c(V1,V3) входит в другие кадры данных. Например (1,abc) вместе! или (1, abd).

dt имеет ту же структуру, что и кадры данных, но включает в себя все данные из всех имеющихся у меня фреймов данных!

1 ответ

Я попытаюсь ответить, но, честно говоря, я не уверен, что понял вашу проблему. Вы также не предоставляете нам достаточных данных для работы, поэтому трудно найти решение вашей проблемы. Тем не менее, здесь это идет. Я закомментировал строки, которые могут быть проблематичными, и использовал некоторые из моих собственных. Я буду рад помочь в дальнейшем, если это приблизит вас.

V=vector("list",length(file))
cnt=1;
for(i in file){
     #input<-read.table(i)

     # Use fread to read the file. It is vert fast
     dt<-fread(i)[,c(1,3), with=FALSE]
     # Create a dummy column which we will sum eventually
     dt[,VAL:=1] #
     #dt<-merge(dt,df1, by=c('V1','V3'),all.x=TRUE)

     # Add in the list-vector to create the big data.table in the end
     V[[cnt]]=dt;
     cnt=cnt+1

 # You don't need a for-loop to merge line by line.
 #for(j in 1:1000){
      #df1<- data.table(input[j,c(1,3)]) 
      #count<-merge(df1,dt, c("V1", "V3")) //dt is a data frame includes all 103 data frames
      #df1["count"]<-nrow(count)
 #}
}

# Create a big data.table
V<-rbindlist(V);

#Aggregate on V1 and V3 and see how many lines are there.
V[,lapply(.SD,sum,na.rm=TRUE),by=c('V1','V3')]

Надеюсь, это поможет. В противном случае, если вы как-то загрузите образец файла, это упростит задачу.

Спасибо

Другие вопросы по тегам