如何在 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
下的项目添加一个名称
我正在使用应用函数从 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