首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用do.call()读取特定行?

如何使用do.call()读取特定行?
EN

Stack Overflow用户
提问于 2019-05-15 02:40:44
回答 2查看 89关注 0票数 1

我使用do.call()命令读取csv文件列表,以便将所有数据点放在一个csv文件中。我一直在使用以下内容:

代码语言:javascript
复制
files = list.files(path = "G:/SafeGraph201708MidWest",
                     pattern = "*.csv",
                     recursive = TRUE,
                     full.names = TRUE)

library(data.table)
  DT = do.call(rbind, lapply(files, fread))

我希望读取特定的行,而不是读取每个文件中的所有行。尤其是在这个范围内的那些:

代码语言:javascript
复制
Data <- filter(DT, longitude >= -86.97 & longitude <= -86.78, 
                 latitude >= 40.35 & latitude <= 40.49)

有没有一种方法可以用do.call()来实现?期待着尽快的回复。谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-15 03:19:21

关于如何解决这个问题,有几个策略。您可以使用lapply将所有数据导入到列表中,然后根据您的过滤器从每个列表元素中筛选出数据。您将使用data.table::rbindlist来生成最终的data.table。另一种方法是一步完成,例如(显然没有经过测试)

代码语言:javascript
复制
library(data.table)

files = list.files(path = "G:/SafeGraph201708MidWest",
                   pattern = "*.csv",
                   recursive = TRUE,
                   full.names = TRUE)

xy <- lapply(files, FUN = function(x) {
  out <- fread(x)
  out <- filter(out, longitude >= -86.97 & longitude <= -86.78, 
                latitude >= 40.35 & latitude <= 40.49)
  out
})

xy <- rbindlist(xy)
票数 3
EN

Stack Overflow用户

发布于 2019-05-15 03:57:16

假设您使用的是Windows PC,并且至少安装了Microsoft Office,请考虑使用JET/ACE SQL引擎(.dll文件)直接查询2007+,而JET/ACE SQL引擎正是MS Access的引擎。

下面包括两个使用Access或Excel的连接字符串。这两个版本都可以工作,并且这些文件确实需要存在,但除了连接到ACE外,它们从不使用。连接后,将从相同或不同的路径查询CSV文件。

代码语言:javascript
复制
library(odbc)

# VERIFY AVAILABLE DSNs AND DRIVERS
odbcListDataSources()

# DSN VERSIONS
conn <- dbConnect(odbc::odbc(), DSN ="MS Access Database;DBQ=C:\\Path\\To\\Access.accdb;");
conn <- dbConnect(odbc::odbc(), DSN ="Excel Files;DBQ=C:\\Path\\To\\Excel.xlsx;");

# DRIVER VERSIONS
conn <- dbConnect(odbc::odbc(), 
                  .connection_string = "Driver={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=C:\\Path\\To\\Access.accdb;");    
conn <- dbConnect(odbc::odbc(), 
                  .connection_string ="Driver={Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)};DBQ=C:\\Path\\To\\Excel.xlsx;");

# CSV QUERY
df <- dbGetQuery(conn, "SELECT t.* 
                        FROM [text;database=C:\\Path\\To\\CSV_Folder].Name_of_File.csv AS t 
                        WHERE t.longitude BETWEEN -86.97 AND -86.78
                          AND t.latitude BETWEEN 40.35 AND 40.49;")    
head(df)

dbDisconnect(conn)

在一个循环中:

代码语言:javascript
复制
files = list.files(path = "G:/SafeGraph201708MidWest",
                   pattern = "*.csv",
                   recursive = TRUE,
                   full.names = TRUE)    

df_list <- lapply(files, function(f)    
    df <- dbGetQuery(conn, 
                     paste0("SELECT t.* ",
                            " FROM [text;database=G:\\SafeGraph201708MidWest].", f, " AS t ",
                            " WHERE t.longitude BETWEEN -86.97 AND -86.78", 
                            "   AND t.latitude BETWEEN 40.35 AND 40.49;")
                    )    
)

final_dt <- rbindlist(df_list)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56136638

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档