在R

时间:2016-02-15 07:44:54

标签: r web-scraping

我对R和网络抓狂世界有点新意。我真的无法弄清楚为什么df[df == "x"]在这种情况下不起作用:

library(rvest)
library(dplyr)
library(tidyr)

# Step 1: Read URL
htmlpage <- read_html("http://www.bmbets.com/football/england/premier-league/")

# Step 2: Extract info from web
Data <- htmlpage %>%
  html_nodes("table") %>%
  html_table()

#Step 3: Subset correct table
Data <- Data[[3]]

# Step 4: Change column names
colnames(Data) <- c("Date", "Venue", "V1", "V2", "V3", "Payout", "B")

# Step 5: Select columns
Data <- select(Data, 1:5)

# Step 6: Separate 'Venue' column with tidyr package
Data <- Data %>%
  separate(Venue, into = c("Home", "Away"), sep = "\\-", extra = "merge")

# Step 7: Change team name
Data[Data == "Leicester City"] <- "Leicester"

tbl_df(Data)

这就是结果:

                        Date               Home            Away    V1    V2    V3
                       (chr)              (chr)           (chr) (dbl) (chr) (dbl)
1                      12:45   West Ham United       Sunderland  1.81  3.61  4.41
2                      15:00    Leicester City     Norwich City  1.49  4.27  6.60
3                      15:00       Southampton          Chelsea  2.59  3.21  2.77
“莱斯特城”队不改变!为什么呢?

'数据'对象是一个data.frame,Home和Away字段是'chr'...我认为问题与tidyr包有关,但即使我只是尝试在步骤#3中更改团队名称不起作用!

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

正如评论中所指出的,问题是由于前导空格和尾随空格。 @Pascal和@nicola的评论也提供了一个很好的解决方案。

如果这些空白角色不打扰你,如果你只是想替换莱斯特城&#34;与&#34;莱斯特&#34;在您的数据框架中,替代方案包括使用sub()gsub()而不是搜索确切的身份。其中一种可能性是:

Data[] <- sapply(Data, function(x) sub("Leicester City", "Leicester", x))
#> head(Data)
#   Date             Home            Away   V1   V2   V3
#1 12:45 West Ham United       Sunderland 1.81 3.61 4.41
#2 15:00       Leicester     Norwich City 1.49 4.27 6.61
#3 15:00     Southampton          Chelsea  2.6 3.21 2.77
#4 15:00      Stoke City      Aston Villa 1.64 3.63 5.78
#5 15:00         Watford      Bournemouth 2.35 3.28 3.04
#6 17:30   West Bromwich   Crystal Palace 2.58 3.12 2.86

答案 1 :(得分:1)

根据Pascal和nicola的评论,

Data[,c("Home", "Away")] <- sapply(Data[,c("Home", "Away")],trimws)
Data[Data == "Leicester City"] <- "Leicester"
tbl_df(Data)