ReadLines 在 R 中使用多个源
ReadLines using multiple sources in R
我正在尝试使用 readLines() 来抓取人口普查托管的 .txt 文件,并将它们编译成一个 .txt/.csv 文件。我可以用它来阅读单独的页面,但我想拥有它,这样我就可以 运行 一个函数,该函数将根据带有 urls 的 csv 和 readLines() 输出。
我对循环和函数属性的了解不是很好,但这里是我尝试合并的代码片段:
以下是我构建 url 矩阵的方法,我可以将其添加到 and/or 变成 csv 并让函数以这种方式读取它。
MasterList <- matrix( data = c("%20Region/ne0001y.txt", "%20Region/ne0002y.txt", "%20Region/ne0003y.txt"), ncol = 1)
urls <- sprintf("http://www2.census.gov/econ/bps/Place/Northeast%s", MasterList)
这是我开始编写的函数(充满问题):
Scrape <- function(x){
for (i in x){
URLS <- i
headers <- readLines(URLS, n=2)
bod <- readLines(URLS)
bodclipped <- bod[-c(1,2,3)]
Totes <- c(headers, bodclipped)
write(Totes, file = "[Directory]/ScrapeTest.txt")
return(head(Totes))
}
}
我的想法是 运行 Scrape(urls) 这将生成我 "urls" [=] 中的 3 urls 的累积29=] 并从除第一个文件之外的所有文件中删除 headers 中的人口普查(headers 与 bodclipped)。
我试过用 readLines 做 lapply() 到 "urls" 但它只生成基于最后一个 url 而不是所有三个的文本,他们仍然有 headers 对于每个我可以删除然后在最后重新附加的文本文件。
如有任何帮助,我们将不胜感激!
由于所有这些文档都是 csv
包含 38 列的文件,您可以使用以下方法轻松合并:
MasterList <- c("%20Region/ne0001y.txt", "%20Region/ne0002y.txt", "%20Region/ne0003y.txt")
urls <- sprintf("http://www2.census.gov/econ/bps/Place/Northeast%s", MasterList)
raw_dat <- lapply(urls, read.csv, skip = 3, header = FALSE)
dat <- do.call(rbind, dat_raw)
这里发生了什么,这是如何循环的?
lapply
函数基本上创建了一个包含 3 (= length(urls)
) 个条目的列表,并用 read.csv(urls[i], skip = 3, header = FALSE)
填充它们。所以 raw_dat 是一个包含 3 data.frames 的列表,其中包含您的数据。 do.call(rbind, dat)
将它们绑定在一起。
header 行接缝不知何故断了,这就是为什么我使用 skip = 3, header = FALSE
,这相当于你的 bod[-c(1,2,3)]
。
如果所有抓取的数据都适合内存,您可以通过这种方式组合它们,最后使用以下方法将其写入文件:
write.csv(dat, "[Directory]/ScrapeTest.txt")
我正在尝试使用 readLines() 来抓取人口普查托管的 .txt 文件,并将它们编译成一个 .txt/.csv 文件。我可以用它来阅读单独的页面,但我想拥有它,这样我就可以 运行 一个函数,该函数将根据带有 urls 的 csv 和 readLines() 输出。
我对循环和函数属性的了解不是很好,但这里是我尝试合并的代码片段:
以下是我构建 url 矩阵的方法,我可以将其添加到 and/or 变成 csv 并让函数以这种方式读取它。
MasterList <- matrix( data = c("%20Region/ne0001y.txt", "%20Region/ne0002y.txt", "%20Region/ne0003y.txt"), ncol = 1)
urls <- sprintf("http://www2.census.gov/econ/bps/Place/Northeast%s", MasterList)
这是我开始编写的函数(充满问题):
Scrape <- function(x){
for (i in x){
URLS <- i
headers <- readLines(URLS, n=2)
bod <- readLines(URLS)
bodclipped <- bod[-c(1,2,3)]
Totes <- c(headers, bodclipped)
write(Totes, file = "[Directory]/ScrapeTest.txt")
return(head(Totes))
}
}
我的想法是 运行 Scrape(urls) 这将生成我 "urls" [=] 中的 3 urls 的累积29=] 并从除第一个文件之外的所有文件中删除 headers 中的人口普查(headers 与 bodclipped)。
我试过用 readLines 做 lapply() 到 "urls" 但它只生成基于最后一个 url 而不是所有三个的文本,他们仍然有 headers 对于每个我可以删除然后在最后重新附加的文本文件。
如有任何帮助,我们将不胜感激!
由于所有这些文档都是 csv
包含 38 列的文件,您可以使用以下方法轻松合并:
MasterList <- c("%20Region/ne0001y.txt", "%20Region/ne0002y.txt", "%20Region/ne0003y.txt")
urls <- sprintf("http://www2.census.gov/econ/bps/Place/Northeast%s", MasterList)
raw_dat <- lapply(urls, read.csv, skip = 3, header = FALSE)
dat <- do.call(rbind, dat_raw)
这里发生了什么,这是如何循环的?
lapply
函数基本上创建了一个包含 3 (= length(urls)
) 个条目的列表,并用 read.csv(urls[i], skip = 3, header = FALSE)
填充它们。所以 raw_dat 是一个包含 3 data.frames 的列表,其中包含您的数据。 do.call(rbind, dat)
将它们绑定在一起。
header 行接缝不知何故断了,这就是为什么我使用 skip = 3, header = FALSE
,这相当于你的 bod[-c(1,2,3)]
。
如果所有抓取的数据都适合内存,您可以通过这种方式组合它们,最后使用以下方法将其写入文件:
write.csv(dat, "[Directory]/ScrapeTest.txt")