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

时间:2019-01-04 15:13:40

标签: r apply names

我正在使用apply函数从stat.NCAA.org站点抓取多个网页,目的是将所有数据合并为一个小标题。我正在尝试清除apply函数中的数据,以便避免为从每个网页抓取的数据分配变量名,这会减慢处理速度(这对于最终将抓取数千页的项目而言)。 / p>

在我的apply函数中,我需要对访问的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)
        }
    }
  )

我收到以下错误:

  

if(。)names(x)==“ Defense” else {:参数不是   可以解释为逻辑

当我尝试运行一个简单的apply函数(该函数需要访问该函数中的名称)时,我的问题似乎是names(x)返回空值。

1 个答案:

答案 0 :(得分:1)

您将列表标识符与names()混淆

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

myList <- as.list(Wartburg_2018_stat_grid)
myList

您可以使用其标识符从列表中检索一个值。例如

myList$Defense

这将返回存储在该标识符下的项目。这与该商品的名称不同。

未指定名称。因此:

names(myList$Defense)

NULL

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

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

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

这会将名称添加到列表myList中位于标识符Defense下的项目中