Purrr 将新列添加到数据框中,这些列是映射函数调用的输出
Purrr add new columns to a data frame that are an output from a map function call
我正在使用一个包含 link 的数据框(称之为 full_df),我想用它来进一步抓取两个 link。这是数据框的示例:
structure(list(CIK = c("1082339", "1276755", "1280511"), COMPANY_NAME = c("COLDSTREAM CAPITAL MANAGEMENT INC",
"CHELSEA COUNSEL CO", "QUANTUM CAPITAL MANAGEMENT"), FORM_TYPE = c("13F-HR",
"13F-HR", "13F-HR"), FILE_DATE = c("2020-05-27", "2020-06-12",
"2020-05-26"), FORM_LINK = c("edgar/data/1082339/0001082339-20-000002.txt",
"edgar/data/1276755/0001420506-20-000683.txt", "edgar/data/1280511/0001280511-20-000003.txt"
), QTR_YEAR = c("Q22020", "Q22020", "Q22020"), FULL_LINK = c("https://www.sec.gov/Archives/edgar/data/1082339/0001082339-20-000002-index.htm",
"https://www.sec.gov/Archives/edgar/data/1276755/0001420506-20-000683-index.htm",
"https://www.sec.gov/Archives/edgar/data/1280511/0001280511-20-000003-index.htm"
)), row.names = c(NA, 3L), class = "data.frame")
我想遍历 FULL_LINK 列并获得另外两个 link,然后我想将它们作为两个新列添加到我的原始数据框中 - xml_link和 html_link.
我可以使用我这样编写的函数获取 links(这里使用单个 link 作为示例):
library(polite)
library(rvest)
library(glue)
library(tidyverse)
test_link <- "https://www.sec.gov/Archives/edgar/data/1082339/0001082339-20-000002-index.htm"
ua = 'Kartik P (for personal use)'
session <- bow("https://www.sec.gov/",
user_agent = ua)
xml_scraper <- function(urll) {
print(glue("Scraping: {urll}"))
temp_link <- session %>%
nod(urll) %>%
scrape(verbose = FALSE) %>%
html_nodes("a") %>%
html_attr('href')
xml_link <- temp_link %>%
nth(12)
html_link <- temp_link %>%
nth(11)
return(data.frame(xml_link, html_link))
}
太棒了!这按预期工作 returns 一个包含我想要的两列的数据框
xml_scraper(test_link)
Scraping: https://www.sec.gov/Archives/edgar/data/1082339/0001082339-20-000002-index.htm
xml_link
1 /Archives/edgar/data/1082339/000108233920000002/CCMI13F2020Q1.xml
html_link
1 /Archives/edgar/data/1082339/000108233920000002/xslForm13F_X01/CCMI13F2020Q1.xml
但是,我想做的是遍历 full_df 中 FULL_LINK 列的每个元素,并添加两个新的 link 作为新创建的元素原始数据框中的 xml_link 和 html_link 列。感觉这应该可以通过 purr::map_dfr 和 bind_cols 调用或同时改变两个名称变量来实现,但我无法弄清楚语法。
如果有任何关于如何让它与 dplyr 和 purrr 一起工作的建议,我们将不胜感激。
提前致谢。
您可以使用 xml_scraper 函数改变数据集。您需要“按行”进行变异,因为您的函数未矢量化。
data_full<-data %>%
rowwise() %>%
mutate(xml_link=xml_scraper(FULL_LINK) %>% pluck("xml_link"),
html_link=xml_scraper(FULL_LINK) %>% pluck("html_link"))
#If you want just the results of the scrape, you can use map
the_xml<-data %>%
split(1:nrow(.)) %>%
map(~pluck(.x$"FULL_LINK")) %>%
map(xml_scraper) %>%
bind_rows()
也许:
df_new <- bind_cols(map_dfr(df$FULL_LINK, xml_scraper), df)
结果:
#> # A tibble: 3 × 9
#> xml_link html_link CIK COMPANY_NAME FORM_TYPE FILE_DATE FORM_LINK QTR_YEAR
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 /Archive… /Archives… 1082… COLDSTREAM … 13F-HR 2020-05-… edgar/da… Q22020
#> 2 /Archive… /Archives… 1276… CHELSEA COU… 13F-HR 2020-06-… edgar/da… Q22020
#> 3 /Archive… /Archives… 1280… QUANTUM CAP… 13F-HR 2020-05-… edgar/da… Q22020
#> # … with 1 more variable: FULL_LINK <chr>
由 reprex package (v2.0.1)
创建于 2022-01-01
您可以编辑您的函数以同时输出 FULL_LINK 并使用它将 2 个新列连接到您的原始数据
xml_scraper <- function(urll) {
print(glue("Scraping: {urll}"))
temp_link <- session %>%
nod(urll) %>%
scrape(verbose = FALSE) %>%
html_nodes("a") %>%
html_attr('href')
xml_link <- temp_link %>%
nth(12)
html_link <- temp_link %>%
nth(11)
return(data.frame(FULL_LINK = urll, xml_link, html_link))
}
然后
data2 <- map_dfr(data$FULL_LINK, .f = xml_scrapper) %>%
left_join(data, ., by = "FULL_LINK")
我正在使用一个包含 link 的数据框(称之为 full_df),我想用它来进一步抓取两个 link。这是数据框的示例:
structure(list(CIK = c("1082339", "1276755", "1280511"), COMPANY_NAME = c("COLDSTREAM CAPITAL MANAGEMENT INC",
"CHELSEA COUNSEL CO", "QUANTUM CAPITAL MANAGEMENT"), FORM_TYPE = c("13F-HR",
"13F-HR", "13F-HR"), FILE_DATE = c("2020-05-27", "2020-06-12",
"2020-05-26"), FORM_LINK = c("edgar/data/1082339/0001082339-20-000002.txt",
"edgar/data/1276755/0001420506-20-000683.txt", "edgar/data/1280511/0001280511-20-000003.txt"
), QTR_YEAR = c("Q22020", "Q22020", "Q22020"), FULL_LINK = c("https://www.sec.gov/Archives/edgar/data/1082339/0001082339-20-000002-index.htm",
"https://www.sec.gov/Archives/edgar/data/1276755/0001420506-20-000683-index.htm",
"https://www.sec.gov/Archives/edgar/data/1280511/0001280511-20-000003-index.htm"
)), row.names = c(NA, 3L), class = "data.frame")
我想遍历 FULL_LINK 列并获得另外两个 link,然后我想将它们作为两个新列添加到我的原始数据框中 - xml_link和 html_link.
我可以使用我这样编写的函数获取 links(这里使用单个 link 作为示例):
library(polite)
library(rvest)
library(glue)
library(tidyverse)
test_link <- "https://www.sec.gov/Archives/edgar/data/1082339/0001082339-20-000002-index.htm"
ua = 'Kartik P (for personal use)'
session <- bow("https://www.sec.gov/",
user_agent = ua)
xml_scraper <- function(urll) {
print(glue("Scraping: {urll}"))
temp_link <- session %>%
nod(urll) %>%
scrape(verbose = FALSE) %>%
html_nodes("a") %>%
html_attr('href')
xml_link <- temp_link %>%
nth(12)
html_link <- temp_link %>%
nth(11)
return(data.frame(xml_link, html_link))
}
太棒了!这按预期工作 returns 一个包含我想要的两列的数据框
xml_scraper(test_link)
Scraping: https://www.sec.gov/Archives/edgar/data/1082339/0001082339-20-000002-index.htm
xml_link
1 /Archives/edgar/data/1082339/000108233920000002/CCMI13F2020Q1.xml
html_link
1 /Archives/edgar/data/1082339/000108233920000002/xslForm13F_X01/CCMI13F2020Q1.xml
但是,我想做的是遍历 full_df 中 FULL_LINK 列的每个元素,并添加两个新的 link 作为新创建的元素原始数据框中的 xml_link 和 html_link 列。感觉这应该可以通过 purr::map_dfr 和 bind_cols 调用或同时改变两个名称变量来实现,但我无法弄清楚语法。
如果有任何关于如何让它与 dplyr 和 purrr 一起工作的建议,我们将不胜感激。
提前致谢。
您可以使用 xml_scraper 函数改变数据集。您需要“按行”进行变异,因为您的函数未矢量化。
data_full<-data %>%
rowwise() %>%
mutate(xml_link=xml_scraper(FULL_LINK) %>% pluck("xml_link"),
html_link=xml_scraper(FULL_LINK) %>% pluck("html_link"))
#If you want just the results of the scrape, you can use map
the_xml<-data %>%
split(1:nrow(.)) %>%
map(~pluck(.x$"FULL_LINK")) %>%
map(xml_scraper) %>%
bind_rows()
也许:
df_new <- bind_cols(map_dfr(df$FULL_LINK, xml_scraper), df)
结果:
#> # A tibble: 3 × 9
#> xml_link html_link CIK COMPANY_NAME FORM_TYPE FILE_DATE FORM_LINK QTR_YEAR
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 /Archive… /Archives… 1082… COLDSTREAM … 13F-HR 2020-05-… edgar/da… Q22020
#> 2 /Archive… /Archives… 1276… CHELSEA COU… 13F-HR 2020-06-… edgar/da… Q22020
#> 3 /Archive… /Archives… 1280… QUANTUM CAP… 13F-HR 2020-05-… edgar/da… Q22020
#> # … with 1 more variable: FULL_LINK <chr>
由 reprex package (v2.0.1)
创建于 2022-01-01您可以编辑您的函数以同时输出 FULL_LINK 并使用它将 2 个新列连接到您的原始数据
xml_scraper <- function(urll) {
print(glue("Scraping: {urll}"))
temp_link <- session %>%
nod(urll) %>%
scrape(verbose = FALSE) %>%
html_nodes("a") %>%
html_attr('href')
xml_link <- temp_link %>%
nth(12)
html_link <- temp_link %>%
nth(11)
return(data.frame(FULL_LINK = urll, xml_link, html_link))
}
然后
data2 <- map_dfr(data$FULL_LINK, .f = xml_scrapper) %>%
left_join(data, ., by = "FULL_LINK")