如何解决使用列表中的单独项目作为 R
我编写了一个脚本,它使用 URL 列表作为输入,然后从网站上抓取某些信息。我已经用 for 循环完成了这项工作,但是处理时间已经很长了,我希望列表会随着时间的推移变得更大,所以我想以更有效的方式重新编码我的脚本。我的想法是消除 for 循环并使用管道运算符来减少处理时间。我原来的(工作代码)如下;
imo <- c()
mmsi <- c()
for(i in 1:nrow(data)){
url <- sprintf("https://www.marinevesseltraffic.com/vessels?vessel=%s&flag=&page=1&sort=lenght&direction=desc",data$NAME[i])
page <- read_html(url)
CSSextract1 <- html_nodes(page,'.td_imo')
CSSextract2 <- html_nodes(page,'.td_mmsi')
imos <- html_text(CSSextract1)[2]
imo[i] <- imos
mmsis <- html_text(CSSextract2)[2]
mmsi[i] <- mmsis
}
data$IMO <- gsub("[\r \n \t]","",imo)
data$MMSI <- gsub("[\r \n \t]",mmsi)
data$NAME <- gsub("\\+"," ",data$NAME)
我重新编写了代码,试图消除for循环如下;
CSSex1 <- function(page){
CSSextract <- html_nodes(page,'.td_imo')
return(CSSextract)
}
data$url <- sprintf("https://www.marinevesseltraffic.com/vessels?vessel=%s&flag=&page=1&sort=lenght&direction=desc",data$NAME)
data$mmsi <- data$url %>% read_html() %>% CSSex1() %>% html_text()[2]
但是它给了我错误;
Error: `x` must be a string of length 1
我假设,按照我编码的方式,列表 (data$url) 作为一个整体现在被作为输入,所以我的问题是; 是否有可能将 data$url 中的每个元素作为输入而不使用 (for) 循环?
解决方法
您可能希望将 url
设置为数据框 (data
) 的列来尝试:
mmsi_func <- function(x) {
z <- x %>%
read_html() %>%
CSSex1() %>%
html_text()
z[2]
}
data <- data %>%
rowwise() %>%
dplyr::mutate(mmsi = mmsi_func(url))
或类似的东西。我不确定预期的输出应该是什么样子,但如果它是一个列表而不是一个向量,你可以对数据框中的列表列使用这个小调整:
mmsi_func <- function(x) {
z <- x %>%
read_html() %>%
CSSex1() %>%
html_text()
z[2]
}
data <- data %>%
rowwise() %>%
dplyr::mutate(mmsi = list(mmsi_func(url)))
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。