【问题标题】:Shinyapps.io Converting All Numeric Data to NAShinyapps.io 将所有数值数据转换为 NA
【发布时间】:2022-01-24 16:35:55
【问题描述】:

我正在尝试在 shinyapps.io 上呈现一个表格,但它填充了所有 NA。我正在从https://www.vegasinsider.com/college-basketball/odds/las-vegas/ 抓取 NCAA 篮球传播。在本地,该表呈现良好。但是在shinyapps.io 上,所有数字价差都显示为NA。如果所有传播值都是字符,它只会在 shinyapps.io 上正确显示。但是我不能执行任何数学运算。只要 BetMGM、Caesers、FanDuel 列是数字,它们就会显示为 NA。我将提供一些代码和数据来帮助重现问题。为了简洁起见,我将跳过很多数据清理步骤。

@akrun 这里是抓取表格的代码。我这样做,然后使用一些正则表达式将 game_info 拆分为组件。

# Table Scraping Code

url <- read_html("https://www.vegasinsider.com/college-basketball/odds/las-vegas/")

spread_table <- url %>% html_table(fill = TRUE)

spread_table <- spread_table[[8]]


spread_table <- spread_table %>%
  rename(game_info = X1,
         VegasInsiderOpen = X2,
         BetMGM = X3,
         Caesers = X4,
         Circa = X5,
         FanDuel = X6,
         DraftKings = X7,
         PointsBet = X8,
         SuperBook = X9,
         VegasInsiderConsensus = X10)



# A tibble: 8 × 15 (spread_table)

 date   time      away_team_name  home_team_name  BetMGM  Caesers  FanDuel 
<chr>   <chr>         <chr>          <chr>        <dbl>   <dbl>    <dbl>  
 12/23  7:00 PM   George Mason    Wisconsin       -11.5   -11.5    -11.5
 12/23  4:00 PM   Liberty         Stanford        -1.5    -2.0     -2.0
 12/23  10:00 PM  BYU             Vanderbilt       4.0     5.5      5.5
 12/24  12:00 AM  South Florida   Hawaii          -4      -3.5      NA

Shiny 应用的极其简化版本:

ui <- fluidPage(
  titlePanel("NCAAB Spreads App"),
  tableOutput("upcoming_games")
)

server <- function(input, output, session) {

  output$upcoming_games <- renderTable({

    spread_table

  })

}

shinyApp(ui, server)

@akrun

雪城大学、泽维尔大学、鲍尔州立大学、圣母大学、博伊西州立大学、圣玛丽斯是该子集中的热门球队。但是从我从你的代码中得到的数据框中并没有说明这一点。

这是@jpdugo17下面的数据框,所以它不会丢失

structure(list(date = c("12/27", "12/28", "12/28", "12/28", 
"12/28", 
"12/28"), time = c("6:00 PM", "7:00 PM", "8:00 PM", "8:00 PM", 
"9:00 PM", "10:00 PM"), away_team_name = c("Brown", 
"Connecticut", 
"Ball State", "Notre Dame", "Fresno State", "Yale"),         
home_team_name = c("Syracuse", 
"Xavier", "Northern Illinois", "Pittsburgh", "Boise State", 
"St. Marys (CA)"
), VegasInsiderOpen = c(-10.5, -3, -3, -6, -4, -12.5), BetMGM = 
c(-9.5, 
NA, NA, NA, NA, NA), Caesers = c(-10, NA, NA, -3.5, -4, -13), 
    Circa = c(-9.5, NA, NA, NA, NA, NA), FanDuel = c(NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_, NA_real_), 
DraftKings = c(-9.5, 
    -3, -2, -3.5, -3.5, -12.5), PointsBet = c(NA_real_, 
NA_real_, 
    NA_real_, NA_real_, NA_real_, NA_real_), SuperBook = 
c(-9.5, 
    NA, NA, -4, -4, -13), VegasInsiderConsensus = c(-9.5, -3, 
    -2, -4, -4, -13)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -6L))

【问题讨论】:

  • 你能不能把它从DT改成renderDataTabledataTableOutput再运行一次
  • 您更新的代码是否正确?我将所有列作为character 类为spread_table - sapply(spread_table, class)# game_info VegasInsiderOpen BetMGM Caesers Circa FanDuel DraftKings "character" "character" "character" "character" "character" "character" "character" PointsBet SuperBook VegasInsiderConsensus "character" "character" "character"
  • @akrun 我已经尝试过 renderTable、renderDataTable 和 render_gt,但都没有奏效。是的 - 我在每一个它正在抓取点差的体育博彩上调用了 as.numeric()。
  • 我从你的代码中得到列值VegasInsiderConsensus: chr [1:8] "135½u-10-2 -10" "135½u-10-5½ -10" "127½u-10-2 -10" "135½u-10-2½ -10" ... 这显然不是数字
  • 从提取的spread_table,你能做到spread_table1 &lt;- spread_table %&gt;% dplyr::select(game_info, BetMGM, Caesers, FanDuel) %&gt;% tidyr::extract(game_info, into = c("date", "time", "away_team_name", "home_team_name"), "^(\\S+)\\s+([^\n]+)[^A-Za-z]+([^\n]+)[^A-Za-z]+(.*)") %&gt;% dplyr::mutate(across(BetMGM:FanDuel, ~ purrr::map_dbl(stringr::str_replace(str_extract(., "-?[^-u]+(?=\\s)"), "(\\d+)½", "(\\1 + 0.5)"), ~ eval(parse(text = .x)))))

标签: r dplyr shiny shinyapps


【解决方案1】:

看来,抓取后的spread_table可能会以无法将提取的子字符串转换为numeric类的方式进行后处理-即当我们做as.numeric时,如果有任何字符,它可能转换为NA

在下面的代码中,select抓取后感兴趣的列,然后extract'game_info'列中的子字符串拆分into'date','time','away_team_name'和'home_team_name'基于正则表达式模式匹配和捕获 ((...)) 那些符合条件的组。 (^(\\S+)) - 将第一组捕获为从字符串开头 (^) 开始的一个或多个非空格字符,后跟一个或多个空格 (\\s+),然后捕获不是换行符的字符字符 (([^\n]+)) 后跟任何不是字母的字符 ([^A-Za-z]+),将第三组捕获为一个或多个字符而不是换行符,然后再次不是字母的字符并捕获其余字符 ((.*) )。然后将across'BetMGM'循环到'FanDuel',提取没有u-的子字符串字符,后跟一个空格((?=\\s)),用+ 0.5替换子字符串分数(如那里只是一个分数),遍历字符串并evalutate 字符串

library(dplyr)
library(tidyr)
library(purrr)
spread_table1 <- spread_table %>%
   dplyr::select(game_info, BetMGM, Caesers, FanDuel) %>% 
   tidyr::extract(game_info, into = c("date", "time", "away_team_name", 
    "home_team_name"), "^(\\S+)\\s+([^\n]+)[^A-Za-z]+([^\n]+)[^A-Za-z]+(.*)")  %>% 
   dplyr::mutate(across(BetMGM:FanDuel, ~
    purrr::map_dbl(stringr::str_replace(str_extract(., "-?[^-u]+(?=\\s)"), 
           "(\\d+)½", "(\\1 + 0.5)"), ~ eval(parse(text = .x)))))

【讨论】:

  • 你能解释一下[^A-Za-z]+([^\n]+)正则表达式是什么意思吗?
  • @jpdugo17 我添加了一些描述。希望有帮助
  • @akrun 你的正则表达式来去除每场比赛的点差:它是从主队还是客队的角度拉点差#?如果你现在刮,只有 1 场即将到来的比赛。但是当我前几天看时,它们中的一些似乎不匹配。
  • @bodega18 如果您查看提取步骤,它正在从 game_info 列中提取。第三个和第四个捕获组,它不是换行符,最后一个是其余字符((.*))您的原始列可能有一些与正则表达式不匹配的情况
  • @bodega18 您能否将所有模式作为一个新问题发布,因为我从您的 cmets 中不清楚
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-07
  • 2021-08-30
  • 2012-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多