使用for循环基于多个数据帧上的ID筛选行

使用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

如何根据R中另一个名为“Camera”的df中的匹配ID从全局目录中筛选180.csv文件?当我试图将我的逐个文件过滤代码(参见步骤3b)合并到for循环(参见步骤3a)中时,我得到了错误:

粘贴(“i”)$SegmentID:$运算符中的错误对原子向量无效

我对for循环函数很陌生,所以非常感谢您的帮助!所有180个文件都有一个唯一的名称,长度不同,但列结构和名称相同。它们看起来像:

 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))