我怎样才能实现这个 IF 条件?

How can I implement this IF condition?

我正在使用 R 从网页上抓取 Table。我的问题是网页上的 table 列之一在这两个名称之间随机更改其 header 名称:“住宿类型”和“房间类型”。

因此,如果我不希望我的 R 脚本在到达特定代码行时中断,我需要手动检查网页并相应地更正我的 R 代码。

这是代码(当该列标题为“住宿类型”时):

output31 <- output3 %>% mutate_at(c("Accommodation Type", "Price for 1 week"), ~str_extract(., ".*\n"))

这是代码(当该列标题为“房间类型”时):

 output31 <- output3 %>% mutate_at(c("Room type", "Price for 1 week"), ~str_extract(., ".*\n"))

有没有办法插入一种 IF 条件,其逻辑是如果发现“住宿类型”作为列标题,则必须忽略提到“房间类型”的那行代码,反之亦然反过来?

编辑(添加了完整代码):

library(rvest)
library(dplyr)
library(stringr)
if (!require(tables)) install.packages('tables')
library(tables)
library(xlsx)

url3 <- read_html("https://www.booking.com/hotel/mu/lux-grand-baie-resort-amp-residences.en-gb.html?aid=356980&label=gog235jc-1DCAsonQFCE2hlcml0YWdlLWF3YWxpLWdvbGZIM1gDaJ0BiAEBmAExuAEXyAEM2AED6AEB-AECiAIBqAIDuAKiwqmEBsACAdICJGFkMTQ3OGU4LTUwZDMtNGQ5ZS1hYzAxLTc0OTIyYTRiZDIxM9gCBOACAQ&sid=729aafddc363c28a2c2c7379d7685d87&all_sr_blocks=36363601_246990918_2_85_0&checkin=2021-12-08&checkout=2021-12-15&dest_id=-1354779&dest_type=city&dist=0&from_beach_key_ufi_sr=1&group_adults=2&group_children=0&hapos=1&highlighted_blocks=36363601_246990918_2_85_0&hp_group_set=0&hpos=1&no_rooms=1&sb_price_type=total&sr_order=popularity&sr_pri_blocks=36363601_246990918_2_85_0__29200&srepoch=1619681695&srpvid=51c8354f03be0097&type=total&ucfs=1&req_children=0&req_adults=2&hp_refreshed_with_new_dates=1")

output3 <- url3 %>% 
  html_nodes(xpath = './/table[@id="hprt-table"]')  %>%
  html_table() %>% .[[1]]

output31 <- output3 %>% mutate_at(c("Accommodation Type", "Price for 1 week"), ~str_extract(., ".*\n"))

您可以创建一个函数来进行清理或在脚本中使用函数内的逻辑。

该函数检查“房间类型”是否在列名中。如果是,用第一行代码清理,如果不是,用else部分清理。

clean_up <- function(data){
  if("Room type" %in% colnames(data)){
    out <- data %>% 
      mutate_at(c("Room type", "Price for 1 week"), ~str_extract(., ".*\n"))
  } else {
    out <- data %>% 
      mutate_at(c("Accommodation Type", "Price for 1 week"), ~str_extract(., ".*\n"))
  }
  
  out
}

output31 <- clean_up(output3)

请注意,您可能违反了 booking.com

的服务条款