Организация данных в векторе для назначения определенным столбцам в data.frame - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть вектор, который я вычеркнул с этого сайта, https://mountwashingtonavalanchecenter.org/hermit-lake-snow-plot-data-all/ Я хотел бы взять вектор, в котором в настоящее время каждый день содержатся данные по 12 элементам, а затем на следующий день, поэтому 1-12 - это деньпотом 13-24 и тд.

Я попытался найти селектор css в html, который позволил бы мне выбирать данные из таблицы по столбцам, а не по всей таблице, однако я не смог найти и эффективный способ сделать это, так как я должен был определитьномер столбца, а также номер строки для каждого конкретного фрагмента данных.использование data.frame () для вектора показало мне данные в порядке значений NULL, представленных знаком "".Я хотел бы, чтобы data.frame выглядел так:

             Date HN24 HN24.SWE. Density HST Total Air.Temp Max.T Min.T      Sky Precip Comments
1 02/08/19\n05:25    0       0.6      NA   0   165      3.5   3.5    -2 Overcast   Rain       NA

Но вектор в настоящее время выглядит так:

> whole_table
  [1] "02/08/19\n05:25"  "  0 CM"           "  0.6 MM"         ""                 
"0CM"             
  [6] "165 CM"           "3.5 C"            "3.5 C"            "-2.0 C"           
"Overcast"        
 [11] "Rain"             ""                 "02/07/19\n05:25"  "  1 CM"           
"  12.9 MM"       
 [16] " 19%"             "1CM"              "169 CM"           "-1.5 C"           
"0.0 C"           
 [21] "-10.0 C"          "Scattered"        "No precipitation" "View"             
"02/06/19\n05:28" 
 [26] "  0 CM"           "  0.9 MM"         ""                 "0CM"              
"168 CM"          
 [31] "-10.0 C"          "6.0 C"            "-10.5 C"          "Clear"            
"No precipitation"
 [36] ""                 

Есть ли какой-нибудь пакет или функция, которая могла бы помочь мне организоватьданные, которые у меня есть в векторе, должны быть назначены правильным столбцам в data.frame?

Спасибо за любую помощь

1 Ответ

0 голосов
/ 18 февраля 2019

Получает ли это то, что вы хотите?

library(tidyverse)
library(rvest)

df <- read_html("https://mountwashingtonavalanchecenter.org/hermit-lake-snow-plot-data-all/") %>%
  html_table() %>%
  flatten_df()
df
#> # A tibble: 50 x 12
#>    Date  HN24  `HN24W(SWE)` `Density (%)` HST   Total `Air T` `T Max`
#>    <chr> <chr> <chr>        <chr>         <chr> <chr> <chr>   <chr>  
#>  1 "02/~ Trace Trace        ""            NC    201 ~ -14.5 C -9.0 C 
#>  2 "02/~ Trace Trace        ""            Trace 204 ~ -16.5 C -9.5 C 
#>  3 "02/~ 13 CM 10.7 MM      12%           13CM  205 ~ -10.0 C -2.0 C 
#>  4 "02/~ Trace 0.1 MM       ""            30CM  195 ~ -7.0 C  -5.0 C 
#>  5 "02/~ 11 CM 6.5 MM       10%           NC    196 ~ -14.0 C -6.0 C 
#>  6 "02/~ 24 CM 29.0 MM      17%           NC    187 ~ -8.0 C  -7.0 C 
#>  7 "02/~ 0 CM  0 MM         ""            0CM   164 ~ -16.0 C -13.0 C
#>  8 "02/~ 0 CM  0 MM         ""            0CM   164 ~ -15.0 C -14.0 C
#>  9 "02/~ 0 CM  0 MM         ""            0CM   164 ~ -19.0 C -17.0 C
#> 10 "02/~ Trace Trace        ""            NC    164 ~ -18.0 C 6.0 C  
#> # ... with 40 more rows, and 4 more variables: `T Min` <chr>, Sky <chr>,
#> #   Precip <chr>, Comments <chr>

Чтобы увидеть таблицу, попробуйте, View(df).

И так как это выглядит так, как будто у нее несколько страниц результатов, вы можетеВы хотите очистить все страницы следующим образом:

base_url <- "https://mountwashingtonavalanchecenter.org/hermit-lake-snow-plot-data-all/?frm-page-11115="

make_tbl <- function(pg_nbr) {
  read_html(paste0(base_url, pg_nbr)) %>%
    html_table() %>%
    flatten_df()
}

1:5 %>%
  set_names(.) %>%
  map(~ make_tbl(.)) %>%
  bind_rows(.id = 'page_number')

# A tibble: 226 x 13
   page_number Date       HN24  `HN24W(SWE)` `Density (%)` HST   Total  `Air T` `T Max` `T Min` Sky    Precip    Comments
   <chr>       <chr>      <chr> <chr>        <chr>         <chr> <chr>  <chr>   <chr>   <chr>   <chr>  <chr>     <chr>   
 1 1           "02/18/19~ Trace Trace        ""            NC    201 CM -14.5 C -9.0 C  -16.5 C Overc~ Snow      ""      
 2 1           "02/17/19~ Trace Trace        ""            Trace 204 CM -16.5 C -9.5 C  -16.5 C Clear  No preci~ ""      
 3 1           "02/16/19~ 13 CM 10.7 MM      12%           13CM  205 CM -10.0 C -2.0 C  -10.0 C Overc~ No preci~ ""      
 4 1           "02/15/19~ Trace 0.1 MM       ""            30CM  195 CM -7.0 C  -5.0 C  -15.0 C Overc~ No preci~ ""      
 5 1           "02/14/19~ 11 CM 6.5 MM       10%           NC    196 CM -14.0 C -6.0 C  -15.0 C Overc~ Snow      ""      
 6 1           "02/13/19~ 24 CM 29.0 MM      17%           NC    187 CM -8.0 C  -7.0 C  -16.0 C Overc~ Snow      View    
 7 1           "02/12/19~ 0 CM  0 MM         ""            0CM   164 CM -16.0 C -13.0 C -18.0 C Clear  No preci~ ""      
 8 1           "02/11/19~ 0 CM  0 MM         ""            0CM   164 CM -15.0 C -14.0 C -20.0 C Clear  No preci~ ""      
 9 1           "02/10/19~ 0 CM  0 MM         ""            0CM   164 CM -19.0 C -17.0 C -19.0 C Clear  No preci~ ""      
10 1           "02/09/19~ Trace Trace        ""            NC    164 CM -18.0 C 6.0 C   -18.0 C Overc~ Snow      View    
# ... with 216 more rows

Наконец, чтобы сделать функцию read_html более надежной, вы можете изменить ее с помощью purrr::possibly, чтобы она работала изящно.Например, нет page = 6 (по крайней мере, пока), но следующее все равно будет «работать»:

possible_read <- possibly(read_html, otherwise = NULL)

make_tbl <- function(pg_nbr) {
  possible_read(paste0(base_url, pg_nbr)) %>%
    html_table() %>%
    flatten_df()
}

1:6 %>%
  set_names(.) %>%
  map(~ make_tbl(.)) %>%
  bind_rows(.id = 'page_number') 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...