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