使用for循环基于多个数据帧上的ID筛选行
如何根据R中另一个名为“Camera”的df中的匹配ID从全局目录中筛选180.csv文件?当我试图将我的逐个文件过滤代码(参见步骤3b)合并到for循环(参见步骤3a)中时,我得到了错误: 粘贴(“i”)$SegmentID:$运算符中的错误对原子向量无效 我对for循环函数很陌生,所以非常感谢您的帮助!所有180个文件都有一个唯一的名称,长度不同,但列结构和名称相同。它们看起来像:使用for循环基于多个数据帧上的ID筛选行,r,for-loop,R,For Loop,如何根据R中另一个名为“Camera”的df中的匹配ID从全局目录中筛选180.csv文件?当我试图将我的逐个文件过滤代码(参见步骤3b)合并到for循环(参见步骤3a)中时,我得到了错误: 粘贴(“i”)$SegmentID:$运算符中的错误对原子向量无效 我对for循环函数很陌生,所以非常感谢您的帮助!所有180个文件都有一个唯一的名称,长度不同,但列结构和名称相同。它们看起来像: df 'File1' df 'Camera' ID Speed Locatio
df 'File1' df 'Camera'
ID Speed Location ID Time
1 30 4 1 10
2 35 5 3 11
3 40 6 5 12
4 30 7
5 35 8
Filtered df 'File1'
ID Speed Location
1 30 4
3 40 6
5 35 8
以下是我的一些代码示例:
#STEP 1: read files
filenames <- list.files(path="06-06-2017_0900-1200uur",
pattern="*.csv")
# STEP 2: import files
for(i in filenames){
filepath <- file.path("06-06-2017_0900-1200uur",paste(i))
assign(i, read.csv2(filepath, header = TRUE, skip = "1"))
}
# STEP 3a: delete rows that do not match ID in df 'Cameras'
for(i in filesnames){
paste("i") <- paste("i")[paste("i")$ID %in% Cameras$ID,]
}
#STEP 3b: filtering one by one
File1 <- File1[File1$ID %in% Camera$ID,]
#步骤1:读取文件
文件名如果我理解这个问题,那么输出应该是file1中的一个数据帧,其中所有行的ID都与相机文件中的一行匹配
这可以通过sqldf()
包和结构化查询语言轻松实现
rawFile1 <- "ID Speed Location
1 30 4
2 35 5
3 40 6
4 30 7
5 35 8
"
rawCamera <- " ID Time
1 10
3 11
5 12
"
file1 <- read.table(textConnection(rawFile1),header=TRUE)
Camera <- read.table(textConnection(rawCamera),header=TRUE)
library(sqldf)
sqlStmt <- "select * from file1 where ID in(select ID from Camera)"
sqldf(sqlStmt,drv="SQLite")
要将此逻辑扩展到许多csv文件,首先我们使用list.files()
函数从存储这些文件的子目录中获取文件列表。例如,如果文件位于R工作目录的data
子目录中,则可以使用以下函数调用
theFiles <- list.files("./data/",".csv",full.names=TRUE)
要将文件组合到单个数据帧中,我们执行do.call()
下面是一种利用列表的方法(通常是更好的方法)。首先,利用list.files()
中的include.names
参数:
现在您有了一个数据帧列表(调用read.csv
的输出)。最后,对每个数据帧应用subset()
,以仅保留与ID列匹配的行:
out <- lapply(dat, function(x) subset(x, ID %in% Camera$ID))
out为什么一个循环用于(文件名中的i)
而另一个用于(名称中的i)
?此外,我认为使用assign()
并分配具有长而复杂名称的变量是一种不好的方法。创建一个列表并将CSV分配给该列表。在步骤3中,“名称”对象来自何处?马吕斯,你想用浆糊(“我”)做什么?那是个打字错误!更正了,谢谢你的其他评论。你也知道我如何根据另一个df中的匹配ID过滤.csv文件吗?@NicolásVelásquez,我想这样我可以逐个调用存储在“文件名”中的.csv文件。我尝试将此代码合并到for循环中:File1[File1$ID%in%Camera$ID,]
theData <- lapply(theFiles,function(x) {
read.table(x,header=TRUE)})
combinedData <- do.call(rbind,theData)
Camera <- read.table(...,header=TRUE)
library(sqldf)
sqlStmt <- "select * from combinedData where ID in(select ID from Camera)"
sqldf(sqlStmt,drv="SQLite")
fns <- list.files(
path = "06-06-2017_0900-1200uur",
pattern = "*.csv",
include.names = T
)
dat <- lapply(fns, read.csv2, header = T, skip = 1)
out <- lapply(dat, function(x) subset(x, ID %in% Camera$ID))