如何在 R 中的应用函数中对向量名称执行逻辑测试

How to perform logical test on vector names within an apply function in R

我正在使用应用函数从 stat.NCAA.org 站点抓取多个网页,目的是将所有数据合并到一个小标题中。我正在尝试清理应用函数中的数据,这样我就可以避免为从每个网页抓取的数据分配变量名,这会减慢进程(这是一个最终会抓取几千页的项目)。

在我的应用函数中,我需要对访问的 url 的名称进行逻辑测试,以了解为该特定数据应用哪些清理函数,但我不知道如何访问名称在一个函数中。这是我的工作代码:

#Load Libraries
library(RSelenium)
library(XML)
library(dplyr)

#Define URLs for stat tables (URL order must be in the order of the vector of names in row 22)
Wartburg_2018_url_vector <- c('https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14355',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14349',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14350',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14353',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14357',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14348',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14341',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14352',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14351',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14342',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14340',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14346',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14345',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14347',
                              'https://stats.ncaa.org/team/750/stats?game_sport_year_ctl_id=14280&id=14280&year_stat_category_id=14356')
names(Wartburg_2018_url_vector) <- c('Defense',
                                     'Fumbles',
                                     'Kicking',
                                     'Kickoffs and KO Returns',
                                     'Participation',
                                     'Passes Defended',
                                     'Passing',
                                     'Punt Returns',
                                     'Punting',
                                     'Receiving',
                                     'Rushing',
                                     'Sacks',
                                     'Scoring',
                                     'Tackles',
                                     'Turnover Margin')

#launch RSelenium
shell('docker run -d -p 4445:4444 selenium/standalone-chrome')
remDr <- remoteDriver(remoteServerAddr = "localhost", port = 4445L, browserName = "chrome")
remDr$open()

#access webpage, parse the html, read the table/list, select the stat grid, convert to data frame, 
#convert to tibble, convert player names to character string, and name list elements
Wartburg_2018_stat_grid <- Wartburg_2018_url_vector %>%
  lapply(
    function(x) {
      remDr$navigate(x)
      htmlParse(remDr$getPageSource()[[1]]) %>%
        readHTMLTable(stringsAsFactors = FALSE) %>%
        (function(y) {
          y[3]
        }) %>%
        as.data.frame() %>%
        as_tibble() %>%
        mutate(Player = stat_grid.Player) %>%
        if(names(x) == 'Defense') {
          mutate(FR = as.double(gsub(",","",stat_grid.Fumbles.Recovered)),
                 Blocks = as.double(gsub(",","",stat_grid.Blkd))
          ) %>%
            select(Player:Blocks)
        }
    }
  )

我收到以下错误:

Error in if (.) names(x) == "Defense" else { : argument is not interpretable as logical

当我尝试 运行 一个需要访问函数内名称的简单应用函数时,我的问题似乎是 names(x) returns 一个空值。

您将列表标识符与 names()

混淆了

使用 lapply() 时,您正在将 Wartburg_2018_stat_grid 转换为列表,然后 运行 您指定的函数。
同样,您可以这样做:

myList <- as.list(Wartburg_2018_stat_grid)
myList

您可以使用它的标识符从列表中检索值。例如

myList$Defense

此 returns 项目存储在该标识符下。这与该项目的名称不同。

未指定名称。因此:

names(myList$Defense)

NULL

您可以使用以下方式指定名称:

names(myList$Defense) <- 'name1'
myList$Defense

                                          name1
"https://stats.ncaa.org/team/750/(...)id=14355" 

这将为列表 myList 中标识符 Defense

下的项目添加一个名称