Итак, у меня есть около 500 файлов данных .txt, все они содержат 8 столбцов. Каждый файл данных имеет в каждом столбце одинаковое количество значений (строк). Если вы сравните datafile1 и datafile2, то у них в основном разное количество строк, но некоторые из этих значений строк одинаковы, а некоторые нет. Я хочу найти все значения, которые различаются между datafile1 и datafile1+1= datafile2, которые я уже решил с помощью sqldf.
сначала я загружаю все файлы с помощью lapply
list_of_files <- list.files(path = ".", recursive = TRUE, pattern = "\\.txt$",
full.names =TRUE)
DT <- lapply(list_of_files, read.table)
загрузить все файлы данных, чтобы первый файл данных можно было выбрать с помощью DT[[1]], а второй с помощью DT[[1+1]], что подходит для цикла.
Для DT я хочу сравнить только столбцы V4 и V5 каждого файла данных, и я думал, что смогу зациклить это с DT[[i]] и DT[[i+1]], но не смог заставить его работать. Ниже я покажу, что сработало для DT[[1]] и DT[[2]]. Сначала я создал data.frames, который содержал столбцы V4 и V5 соответствующих data.frames:
dt1<-data.frame(DT[[1]]$V4,DT[[1]]$V5)
dt2<-data.frame(DT[[1+1]]$V4,DT[[1+1]]$V5)
Здесь я выбираю только те значения, которые различаются между dt1 и dt2:
df<-sqldf('SELECT * FROM dt1 EXCEPT SELECT * FROM dt2')
Я хотел бы зациклить действие df по всем 500 файлам данных DT[[i]] DT[[i+1]] сохранить все значения df в data.frame
Может быть у кого-то есть идея, как это зациклить?
заранее спасибо
Создайте функцию:
get_data<- function(dt1, dt2) sqldf('SELECT * FROM dt1 EXCEPT SELECT * FROM dt2')
Теперь используйте Map
, чтобы применить эту функцию к циклу и применить ее к каждому DT[i]
и DT[i+1]
.
result <- Map(get_data, DT[-length(DT)], DT[-1])
Спасибо большое работает отлично! Я знал, что кто-нибудь это узнает! Вывод результата на данный момент содержит в вашем решении все столбцы с V1 по V8. Если вам нужны только определенные столбцы, вы можете изменить функцию, как показано ниже:
rm(list=ls())
library(sqldf)
setwd("Path_to_txt-files")
list_of_files <- list.files(path = ".", recursive = TRUE,pattern = "\\.txt$",full.names = TRUE)
DT <- lapply(list_of_files, read.table)
dt1<-data.frame(DT[[25]]$V4,DT[[25]]$V5)
dt2<-data.frame(DT[[25+1]]$V4,DT[[25+1]]$V5)
#df<-sqldf('SELECT * FROM dt1 EXCEPT SELECT * FROM dt2')
не используется, если вы хотите зациклить его на нескольких файлах
вывод результата будет содержать только столбцы V4 и V5:
get_data<- function(dt1, dt2) sqldf('SELECT V4,V5 FROM dt1 EXCEPT SELECT V4,V5 FROM dt2')
result <- Map(get_data, DT[-length(DT)], DT[-1])
result