我有一堆具有不同标头的数据框,但我想将它们附加到一个大型数据框中。如果记录没有任何值,则可以将这些列留为空白。
下面是代码示例。我想将CHK.bs,OXY.bs和FRCOY.bs结合在一起。但是,我的实际数据由100多个记录组成,每个记录都以.bs结尾,因此我将需要一种简单的方法来引用所有这些数据框。
library(rvest)
library(stringr)
library(magrittr)
library(httr)
Symbols<- c("FRCOY","OXY","CHK")
for (i in 1:length(Symbols)) {
bs <- "https://finance.yahoo.com/quote/"
bs <- paste0(bs,Symbols[i],"/balance-sheet?p=",Symbols[i])
bs <- read_html(bs, user_agent="Mozilla/5.0 (Macintosh; Intel Mac OS X x.y; rv:10.0) Gecko/20100101 Firefox/10.0")
bs.nodes <- bs%>%html_nodes(".fi-row")
bs.df = NULL
for(j in bs.nodes){
r <- list(j %>%html_nodes("[title],[data-test='fin-col']")%>%html_text())
bs.df <- rbind(bs.df,as.data.frame(matrix(r[[1]], ncol = length(r[[1]]), byrow = TRUE), stringsAsFactors = FALSE))
}
bs.matches <- str_match_all(bs %>% html_node('#Col1-3-Financials-Proxy')%>%html_text(),'\\d{1,2}/\\d{1,2}/\\d{4}')
bs.units <-str_extract(bs %>% html_node('#Col1-3-Financials-Proxy')%>%html_text(),'(?<=All numbers in\\s)\\w+\\s?s')
bs.headers <- c('Breakdown',bs.matches[[1]][,1])
Ticker <- Symbols[i]
bs.df <- cbind(bs.df,Ticker)
assign(paste0(Symbols[i],'_bs'),value = bs.df,envir = parent.frame())
}
根据上述OP的要求,以下是我的意思simple self-contained example:
library(tidyverse)
bs <- list()
#Generate some example data
makeDataFrames <- function(symbol, n) {
# Note the global assignment
bs[[paste0(symbol, "-nodes")]] <<- tibble(Symbol=symbol, Type="Node", X=runif(n), Y=runif(n))
bs[[paste0(symbol, "-df")]] <<- tibble(Symbol=symbol, Type="DF", X=runif(n), Z=runif(n))
}
makeDataFrames("FRCOY", 5)
makeDataFrames("OXY", 10)
makeDataFrames("CHK", 7)
# print(bs)
# Demonstrate the solution
allData <- bind_rows(bs)
allData
提供
# A tibble: 44 x 5
Symbol Type X Y Z
<chr> <chr> <dbl> <dbl> <dbl>
1 FRCOY Node 0.351 0.718 NA
2 FRCOY Node 0.868 0.820 NA
3 FRCOY Node 0.0338 0.897 NA
4 FRCOY Node 0.952 0.621 NA
5 FRCOY Node 0.630 0.538 NA
6 FRCOY DF 0.511 NA 0.209
7 FRCOY DF 0.178 NA 0.768
8 FRCOY DF 0.607 NA 0.514
9 FRCOY DF 0.894 NA 0.270
10 FRCOY DF 0.184 NA 0.926
# … with 34 more rows