Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 按行与按行迭代_R_Dplyr_Purrr - Fatal编程技术网

R 按行与按行迭代

R 按行与按行迭代,r,dplyr,purrr,R,Dplyr,Purrr,有人知道按行和按行之间的区别吗?我正在努力抓取3个简单的网站,但我似乎无法找到任何一种方法,因此我不确定我是否只是使用了purr/dplyr错误 数据: 对于每个URL(或行),我想使用以下功能刮取网页: dplyr approach: table %>% rowwise() %>% read_html() %>% extract2(2) %>% html_nodes("#_brand4 span") %>%

有人知道按行<代码>和按行<代码>之间的区别吗?我正在努力抓取3个简单的网站,但我似乎无法找到任何一种方法,因此我不确定我是否只是使用了
purr
/
dplyr
错误

数据:

对于每个URL(或行),我想使用以下功能刮取网页:

dplyr approach:
    table %>%
      rowwise() %>%
      read_html() %>%
      extract2(2) %>%
      html_nodes("#_brand4 span") %>%
      html_text()
Purr方法:

#Apply function to each row
table %>%
  by_row(..f = parserows(), collate = c("rows"), .to = "scrapedname")

#Takes in row 
parserows = function(){
      read_html() %>%
      extract2(., 2) %>%
      html_nodes("#_brand4 span") %>%
      html_text()
}
purr
方法中,我不断得到一个错误,其中x缺失,没有默认值。值不应该来自行号吗?否则,我将编写一个for循环,指定行号所在的索引

使用此magrittr管道,我的代码不断出现超时错误。因此:

  • 在使用purr/dplyr迭代df中的所有元素时,如何避免超时错误?如果是这样,我应该考虑使用
    trycatch
    ,还是使用某种错误处理机制在错误发生时捕获错误

  • 行/顺行是否真的用于此任务?我认为这些函数应该迭代一行中的每个元素,这并不是我试图解决的问题。谢谢

    output = table$link %>%
    extract() %>%
    map(read_html) %>%
    html_nodes(row,"#_brand4 span") %>%
    html_text(row)
    

  • 以下是@Thomas K的建议:

    首先,仅使用
    purr

    library(purrr)
    library(dplyr)
    library(httr)
    library(xml2)
    library(rvest)
    
    table$link %>%
      purrr::set_names() %>% 
      map(read_html) %>%
      map(html_node, "#_brand4 span") %>%
      map(html_text)
    
    # $`https://www.ratebeer.com/beer/8481/`
    # [1] "Föroya Bjór"
    # 
    # $`https://www.ratebeer.com/beer/3228/`
    # [1] "King Brewing Company"
    # 
    # $`https://www.ratebeer.com/beer/10325/`
    # [1] "Bavik-De Brabandere"
    
    (注意无需使用
    html\u节点
    (复数),而无需使用
    html\u节点
    (单数))

    一种混合的
    dplyr
    /
    purr
    替代方案,如果需要重用,可以将每个html文档保存在一个整洁的数据框中:

    res <-
      table %>% 
      mutate(html = map(link, read_html),
             brand_node = map(html, html_node, "#_brand4 span"),
             scrapedname = map_chr(brand_node, html_text)) 
    
    对于超时问题,您也可以根据@Thomas K的评论,简单地将
    read_html
    包装在
    safety()
    mably()
    (它们确实是
    tryCatch
    的替代品):

    刮片时的一个好做法是在服务器上非常温和,因此您甚至可以在每个请求之前手动添加一个偏移时间,例如使用
    Sys.sleep(1+runif(1))

    table$link %>%
      c("https://www.wrong-url.foobar") %>% 
      purrr::set_names() %>% 
      map(~ {
        Sys.sleep(1 + runif(1))
        safe_retry_read_html(.x)
      }) %>%
      map(html_node, "#_brand4 span") %>%
      map_chr(html_text)
    
    #  https://www.ratebeer.com/beer/8481/  https://www.ratebeer.com/beer/3228/ 
    #                        "Föroya Bjór"               "King Brewing Company" 
    # https://www.ratebeer.com/beer/10325/         https://www.wrong-url.foobar 
    #                "Bavik-De Brabandere"                                   NA 
    
    最后,还有一个关于
    by_row()
    /
    rowwise()

    首先,请注意,
    by_row
    已从
    purrr
    的开发版本中删除,并移动到一个单独的包
    purrryr
    ,在该包中它已被弃用,建议“使用以下组合:
    tidyr::nest()
    dplyr::mutate()
    purrr::map()

    help(“rowwise”)
    rowwise
    主要用于“在创建列表变量时用于
    do()
    的结果”


    因此,不,也不是“真正用于此任务”,它们都是多余的。

    以下是@Thomas K的建议:

    首先,仅使用
    purr

    library(purrr)
    library(dplyr)
    library(httr)
    library(xml2)
    library(rvest)
    
    table$link %>%
      purrr::set_names() %>% 
      map(read_html) %>%
      map(html_node, "#_brand4 span") %>%
      map(html_text)
    
    # $`https://www.ratebeer.com/beer/8481/`
    # [1] "Föroya Bjór"
    # 
    # $`https://www.ratebeer.com/beer/3228/`
    # [1] "King Brewing Company"
    # 
    # $`https://www.ratebeer.com/beer/10325/`
    # [1] "Bavik-De Brabandere"
    
    (注意无需使用
    html\u节点
    (复数),而无需使用
    html\u节点
    (单数))

    一种混合的
    dplyr
    /
    purr
    替代方案,如果需要重用,可以将每个html文档保存在一个整洁的数据框中:

    res <-
      table %>% 
      mutate(html = map(link, read_html),
             brand_node = map(html, html_node, "#_brand4 span"),
             scrapedname = map_chr(brand_node, html_text)) 
    
    对于超时问题,您也可以根据@Thomas K的评论,简单地将
    read_html
    包装在
    safety()
    mably()
    (它们确实是
    tryCatch
    的替代品):

    刮片时的一个好做法是在服务器上非常温和,因此您甚至可以在每个请求之前手动添加一个偏移时间,例如使用
    Sys.sleep(1+runif(1))

    table$link %>%
      c("https://www.wrong-url.foobar") %>% 
      purrr::set_names() %>% 
      map(~ {
        Sys.sleep(1 + runif(1))
        safe_retry_read_html(.x)
      }) %>%
      map(html_node, "#_brand4 span") %>%
      map_chr(html_text)
    
    #  https://www.ratebeer.com/beer/8481/  https://www.ratebeer.com/beer/3228/ 
    #                        "Föroya Bjór"               "King Brewing Company" 
    # https://www.ratebeer.com/beer/10325/         https://www.wrong-url.foobar 
    #                "Bavik-De Brabandere"                                   NA 
    
    最后,还有一个关于
    by_row()
    /
    rowwise()

    首先,请注意,
    by_row
    已从
    purrr
    的开发版本中删除,并移动到一个单独的包
    purrryr
    ,在该包中它已被弃用,建议“使用以下组合:
    tidyr::nest()
    dplyr::mutate()
    purrr::map()

    help(“rowwise”)
    rowwise
    主要用于“在创建列表变量时用于
    do()
    的结果”


    因此,不,这两种方法都不是“真正用于此任务”,它们都是多余的。

    我会将您的链接视为向量并映射到它们上面:
    my_dat$link%%>%map(read_html)%%>%唯一的问题是,当我有很多链接要抓取时,我总是会遇到超时错误。请参阅更新的代码。请查看
    purrr::safety
    purrr::transpose
    。我会将您的链接视为向量并映射到它们上面:
    my_dat$link%%>%map(read_html)%%>%唯一的问题是,当我有很多链接要抓取时,我总是会遇到超时错误。查看更新的代码。查看
    purrr::safety
    purrr::transpose
    。感谢您的详细解释,因为我之前意识到rowwise并不是我想要做的。我看到了一些可能使用的解决方案,但看起来有些粗略。我需要浏览大约7000个URL,因此这非常有用。您是否应该使用magrittr管道将多个映射命令链接在一起?我真的很喜欢在管道中使用map的想法,但是我有点不确定{}在map命令中做了什么。您可以像我一样链接
    map()
    s,或者将所有内容放在一个命令中。我想这是口味的问题。如需了解波浪线
    ~
    的含义,请参阅例如
    purrr
    渐晕图。它本质上是一个通过通用公式符号简化的匿名函数为了完整性,此代码更容易理解,但不像您的答案那样详细:
    getBrewerName%map(read\u html)%%>%map(html\u节点,xpath='/*[(@id=“\u brand4”)]///span')%%>%map(html\u text)%%>%unlist,NA)}
    感谢您的详细解释,因为我之前意识到rowwise并不完全是我想要做的,lol。我看到了一些可能使用的解决方案,但看起来有些粗略。我有大约7000个网址,我需要通过,所以这是非常有帮助的。你应该b
    table$link %>%
      c("https://www.wrong-url.foobar") %>% 
      purrr::set_names() %>% 
      map(~ {
        Sys.sleep(1 + runif(1))
        safe_retry_read_html(.x)
      }) %>%
      map(html_node, "#_brand4 span") %>%
      map_chr(html_text)
    
    #  https://www.ratebeer.com/beer/8481/  https://www.ratebeer.com/beer/3228/ 
    #                        "Föroya Bjór"               "King Brewing Company" 
    # https://www.ratebeer.com/beer/10325/         https://www.wrong-url.foobar 
    #                "Bavik-De Brabandere"                                   NA