我一直在抓取并组合多个数据集,但是,我觉得我的方法可以更有效率,目前卡住了。
我最初的方法是单独下载每个数据集,并使用rbind()创建一个大型数据集:
library(tidyverse)
library(rvest)
uber <- read_html("http://h1bdata.info/index.php?em=Uber&job=&city=&year=All+Years") %>%
html_node("#myTable") %>%
html_table()
airbnb <- read_html("http://h1bdata.info/index.php?em=Airbnb&job=&city=&year=All+Years") %>%
html_node("#myTable") %>%
html_table()
rbind(uber, airbnb)
然而,超过十个数据集,这可能是乏味和低效的。所以我尝试编写一个循环,到目前为止我有以下内容:
#I created a list of the tech companies for my loop index
tech.companies <-as.list(c("Airbnb", "Amazon", "Apple", "Facebook", "Google", "Linkedin", "Microsoft", "Twitter", "Uber", "Yahoo"))
#I then create the loop. This has been my "best" attempt
for(i in 1:length(tech.companies)) {
url <- paste0("http://h1bdata.info/index.php?em=", i, "&job=&city=&year=All+Years")
tble <- read_html(url) %>%
html_node("#myTable") %>%
html_table()
}
但是,我并不真正理解我的循环在做什么。什么是输出?如何将每个循环的结果存储在一个新变量中?是否可以使用rbind()来组合循环内的数据集?我阅读了很多应用函数更好地在R中循环使用,在这样的情况下仍然如此吗?
您可以分享的任何见解将不胜感激。
答案 0 :(得分:1)
一般情况下,我尽可能避免使用R中的印模循环。然而,在这种情况下,我更喜欢使用循环,但原因可能是我开始在Matlab中编码(循环更常见)。如果您坚持应用函数(我无法提供性能基准),则可以预定义,例如您在每个循环迭代中预先在列表中生成的所有URL /参数,编写抓取函数并运行[s] apply [list,myfun()]
要存储循环的结果,您可以使用list或rbind,每个循环使用一个temp var,使用一个“final”var,通过迭代迭代所有临时变量迭代。
在你的情况下,我会找一份清单,因为你显然希望每个雇主有一张桌子。一行一行(例如,如果你试图逐项刮取商品价格)在这种情况下我没有必要(开放供讨论)
循环本身与您期望的有些不同。
迭代参数import pandas as pd
import numpy as np
df = pd.read_csv('test_dataset.csv')
df.head(3)
one_column = df.iloc[:,0]
one_column.head(3)
仅返回一个数字,而不是向量中的char值。所以“i
”返回一个向量1:10(10个雇主),这意味着你在i in 1:length(x)
循环中创建的url不会插入公司名称,只会插入迭代次数(1:10) 。在下面的代码中,您将看到如何使用“url <- paste0()
”检索向量“tech.companies”的第i个元素来获取正确的URL
tech.companies[i]
然后,您可以访问结果data.frames,例如使用以下代码:
tech.companies <- c("Airbnb", "Amazon", "Apple", "Facebook", "Google", "Linkedin", "Microsoft", "Twitter", "Uber", "Yahoo")
result <- list() # init list (so R knows you store tble in a list)
for(i in 1:length(tech.companies)) {
url <- paste0("http://h1bdata.info/index.php?em=", tech.companies[i], "&job=&city=&year=All+Years")
tble <- read_html(url) %>%
html_node("#myTable") %>%
html_table()
result[[i]] <- tble
}