基本上,我要做的是生成一个.csv
文件,其中包含使用theyworkforyou.co.uk
API在给定时间范围内来自英国公民的所有演讲。我写了一个收集数据的函数:
getData <- function(url){
require(jsonlite)
raw.data <- readLines(url, warn="F")
rd <- fromJSON(raw.data)
rd <- as.data.frame(rd)
return(rd)
}
其中url
将被定义为给定的MP,它们为您的ID工作,如此列表中包含650个条目:
MP.ID <- as.list(MP.df$Person.ID) # All the MPs' ID's, e.g. 11111 for Ms. Smith
Scraper <- paste0("http://www.theyworkforyou.com/api/getHansard?key=SECRET=",MP.ID,"&year=2015&order=d&num=1000&output=js")
所以,例如,这个命令
test.df <- getData(Scraper[1])
会在数据框中返回文本数据(加上一些辅助内容)。
然后,我的下一个函数清除文本并留下相关信息并将其保存到包含csv标题中相应MP的ID的.csv中,以便唯一标识它:
textClean <- function(scrapedData){
Speaker.ID <- scrapedData$rows.person_id[1]
slimScrape <- scrapedData[c(9,16,20)]
slimScrape$Year <- substr(slimScrape$rows.hdate,1,4)
slimScrape$Year <- as.numeric(slimScrape$Year)
slimScrape <- subset(slimScrape,Year==2015)
colnames(slimScrape) <- c("Date","Person.ID","Text.Full","Year")
write.csv(slimScrape,file = paste0("HansardScrapes/","hansard",Speaker.ID,".csv"))
}
这适用于单个案例(即先前生成的test.df),将正确的文件保存到所需的位置。
现在出现了问题。我想为所有650 MP调整此循环。它不会工作。它返回以下错误消息:
“错误:尝试应用非功能”
当我尝试运行此循环时:
for(i in 1:650(Scraper)){
Contributions <- getData(Scraper[i])
textClean(Contributions)
}
再次,如果这是一个非常无聊的问题我很抱歉,答案是完全明显的。我尝试过用lapply和sapply工作,但我无法完全理解他们的工作。此外,它也不起作用:)。
答案 0 :(得分:0)
试试这个(循环通过MP.ID)
lapply(MP.ID, function(mpid){
url <- paste0("http://www.theyworkforyou.com/api/getHansard?key=SECRET=",mpid,"&year=2015&order=d&num=1000&output=js")
scrapedData <- getData(url)
textClean (scrapedData)
})
答案 1 :(得分:0)
循环错误,请尝试:
for(i in 1:650){
Contributions <- getData(Scraper[i])
textClean(Contributions)
}
你使用的650(Scraper)试图在Scraper上调用一个名为650的函数(它不存在且不存在)。你可以尝试:
for(i in 1:length(Scraper)){...
更具普遍性。
此外,您应该将命令require(jsonlite)
移出功能 - 否则每当您只需要在会话中调用它时它就会调用它。
如果这不能解决您的问题,请粘贴dput(test.df)
,否则要测试它,我们必须注册API密钥。