Найти число вхождений набора из двух столбцов фрейма данных в другие фреймы данных в 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')]
Надеюсь, это поможет. В противном случае, если вы как-то загрузите образец файла, это упростит задачу.
Спасибо