R 中的 sqldf 比较两个 data.frames 并存储输出

sqldf in R compare two data.frames and store output

所以,我有大约 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)

加载所有数据文件,这样第一个数据文件可以select用DT[[1]]编辑,第二个数据文件用DT[[1+1]]编辑,这将适合循环。

对于 DT,我只想比较每个数据文件的 V4 和 V5 列,我想我可以用 DT[[i]] 和 DT[[i+1]] 循环它,但我无法得到它上班。下面我展示了 DT[[1]] 和 DT[[2]] 的工作原理。首先,我创建了 data.frames,其中包含相应 data.frames:

的 V4 和 V5 列

dt1<-data.frame(DT[[1]]$V4,DT[[1]]$V5)

dt2<-data.frame(DT[[1+1]]$V4,DT[[1+1]]$V5)

这里我select只有dt1和dt2的值不同:

df<-sqldf('SELECT * FROM dt1 EXCEPT SELECT * FROM dt2')

我想在所有 500 个数据文件上循环执行 df 操作 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