我正在尝试绑定以下列表的行(由于字符限制,我将其缩短了,但是列表中有约15个元素)。
library(tidyverse)
library(rvest)
library(magrittr)
url <- "http://stats.swehockey.se/Teams/Info/PlayersByTeam/9301"
url %>%
read_html() %>%
html_nodes('[class = "tblContent"]') %>%
html_table() %>%
magrittr::extract(c(TRUE, FALSE))
#> [[1]]
#> A I K IF A I K IF A I K IF
#> 1 Playing Statistics Playing Statistics Playing Statistics
#> 2 Rk No Name
#> 3 1 10 Gynge, Richard
#> 4 2 21 Sandberg, Christian
#> 5 3 6 Tärnström, Dick
#> 6 4 18 Bergström, Patrik
#> 7 5 20 Bång, Daniel
#> 8 6 92 Westerling, Jonas
#> 9 7 68 Ahlström, Victor
#> 10 8 22 Beck, Mattias
#> 11 9 79 Eriksson, Henrik
#> 12 10 86 Ahlström, Oscar
#> 13 11 16 Ryno, Johan
#> 14 12 23 Liwing, Jonas
#> 15 13 19 Ericsson, Tobias
#> 16 14 37 Johansson, Stefan
#> 17 15 45 Savilahti-Nagander, Per
#> 18 16 33 Engblom, David
#> 19 17 4 Österberg, Mikael
#> 20 18 3 Jungbeck, Andreas
#> 21 19 7 Olsson, Filip
#> 22 20 17 Carlsson, Fredrik
#> 23 21 89 Lawson, Lucas
#> 24 22 15 Korduner, Fredric
#> 25 23 72 Dahlström, Andreas
#> 26 24 12 Nemeth, Patrik
#> 27 25 89 Franzén, Mathias
#> 28 26 40 Heino-Lindberg, Christopher
#> 29 27 12 Bergman, Alexander
#> 30 89 Gozzi, Patric
#> 31 72 Lundberg, Martin
#> 32 30 15 Lehmann, Niclas
#> 33 31 72 Nordström, Joakim
#> 34 89 Ramsten, Joakim
#> 35 33 35 Lundström, Niklas
#> 36 34 12 Nilsson, Henrik
#> 37 35 35 Strandberg, Joakim
#> 38 36 35 Bjurö, Jonatan
#> 39 37 31 Holmgren, Fredrik
#> A I K IF A I K IF A I K IF
#> 1 Playing Statistics Playing Statistics Playing Statistics
#> 2 Pos GP G
#> 3 LW 51 28
#> 4 CE 51 20
#> 5 LD 42 9
#> 6 RW 51 15
#> 7 RW 48 14
#> 8 LW 46 7
#> 9 LW 51 14
#> 10 LW 51 8
#> 11 CE 47 7
#> 12 RW 52 6
#> 13 RW 47 9
#> 14 RD 52 8
#> 15 LW 50 7
#> 16 LD 43 4
#> 17 RD 49 3
#> 18 CE 39 5
#> 19 RD 50 3
#> 20 LD 45 1
#> 21 LD 33 0
#> 22 LD 45 0
#> 23 CE 11 3
#> 24 RW 13 2
#> 25 CE 6 1
#> 26 LD 16 0
#> 27 LD 5 0
#> 28 GK 41 0
#> 29 LD 1 0
#> 30 LD 1 0
#> 31 LD 1 0
#> 32 RW 1 0
#> 33 CE 2 0
#> 34 LD 2 0
#> 35 GK 4 0
#> 36 RD 4 0
#> 37 GK 5 0
#> 38 GK 19 0
#> 39 GK 35 0
#> A I K IF A I K IF A I K IF
#> 1 Playing Statistics Playing Statistics Playing Statistics
#> 2 A TP PIM
#> 3 24 52 16
#> 4 27 47 67
#> 5 23 32 74
#> 6 16 31 57
#> 7 17 31 86
#> 8 23 30 18
#> 9 14 28 16
#> 10 18 26 22
#> 11 15 22 52
#> 12 15 21 8
#> 13 11 20 34
#> 14 12 20 36
#> 15 9 16 12
#> 16 11 15 26
#> 17 9 12 90
#> 18 5 10 22
#> 19 7 10 69
#> 20 7 8 52
#> 21 5 5 2
#> 22 5 5 49
#> 23 0 3 2
#> 24 1 3 2
#> 25 2 3 4
#> 26 3 3 8
#> 27 1 1 12
#> 28 1 1 4
#> 29 0 0 0
#> 30 0 0 0
#> 31 0 0 0
#> 32 0 0 2
#> 33 0 0 0
#> 34 0 0 0
#> 35 0 0 0
#> 36 0 0 0
#> 37 0 0 0
#> 38 0 0 0
#> 39 0 0 0
#> A I K IF A I K IF A I K IF
#> 1 Playing Statistics Playing Statistics Playing Statistics
#> 2 + - +/-
#> 3 42 22 20
#> 4 34 24 10
#> 5 33 24 9
#> 6 35 24 11
#> 7 31 27 4
#> 8 31 16 15
#> 9 29 22 7
#> 10 22 23 -1
#> 11 27 25 2
#> 12 27 22 5
#> 13 28 21 7
#> 14 43 28 15
#> 15 21 15 6
#> 16 30 19 11
#> 17 36 26 10
#> 18 19 11 8
#> 19 23 25 -2
#> 20 28 20 8
#> 21 14 8 6
#> 22 29 16 13
#> 23 6 1 5
#> 24 4 3 1
#> 25 4 2 2
#> 26 11 4 7
#> 27 1 2 -1
#> 28
#> 29 0 0 0
#> 30 0 0 0
#> 31 0 0 0
#> 32 0 0 0
#> 33 0 0 0
#> 34 0 0 0
#> 35
#> 36 0 0 0
#> 37
#> 38
#> 39
#> A I K IF A I K IF A I K IF
#> 1 Playing Statistics Playing Statistics Playing Statistics
#> 2 GWG PPG SHG
#> 3 5 5 0
#> 4 4 8 1
#> 5 2 7 0
#> 6 2 3 0
#> 7 2 8 1
#> 8 2 1 1
#> 9 4 3 0
#> 10 1 4 1
#> 11 0 0 0
#> 12 0 3 0
#> 13 0 0 0
#> 14 2 3 0
#> 15 1 0 1
#> 16 1 1 0
#> 17 1 0 0
#> 18 4 0 0
#> 19 1 0 0
#> 20 1 1 0
#> 21 0 0 0
#> 22 0 0 0
#> 23 0 0 0
#> 24 0 0 0
#> 25 1 0 0
#> 26 0 0 0
#> 27 0 0 0
#> 28 0 0 0
#> 29 0 0 0
#> 30 0 0 0
#> 31 0 0 0
#> 32 0 0 0
#> 33 0 0 0
#> 34 0 0 0
#> 35 0 0 0
#> 36 0 0 0
#> 37 0 0 0
#> 38 0 0 0
#> 39 0 0 0
#> A I K IF A I K IF A I K IF
#> 1 Playing Statistics Playing Statistics Playing Statistics
#> 2 SOG SG% FO+
#> 3 131 21.37 140
#> 4 157 12.74 360
#> 5 102 8.82 0
#> 6 88 17.05 6
#> 7 91 15.38 2
#> 8 72 9.72 171
#> 9 90 15.56 18
#> 10 102 7.84 3
#> 11 91 7.69 435
#> 12 92 6.52 1
#> 13 127 7.09 234
#> 14 91 8.79 1
#> 15 79 8.86 18
#> 16 95 4.21 0
#> 17 86 3.49 0
#> 18 35 14.29 245
#> 19 33 9.09 0
#> 20 66 1.52 0
#> 21 17 0.00 0
#> 22 17 0.00 0
#> 23 19 15.79 46
#> 24 13 15.38 0
#> 25 4 25.00 9
#> 26 8 0.00 0
#> 27 3 0.00 0
#> 28 0 N/A
#> 29 0 N/A 0
#> 30 0 N/A 0
#> 31 0 N/A 0
#> 32 1 0.00 0
#> 33 1 0.00 5
#> 34 0 N/A 0
#> 35 0 N/A
#> 36 0 N/A 0
#> 37 0 N/A
#> 38 0 N/A
#> 39 1 0.00
#> A I K IF A I K IF [Top]
#> 1 Playing Statistics Playing Statistics Playing Statistics
#> 2 FO- FO FO%
#> 3 127 267 52.43
#> 4 270 630 57.14
#> 5 0 0 N/A
#> 6 10 16 37.50
#> 7 5 7 28.57
#> 8 192 363 47.11
#> 9 29 47 38.30
#> 10 5 8 37.50
#> 11 335 770 56.49
#> 12 3 4 25.00
#> 13 250 484 48.35
#> 14 9 10 10.00
#> 15 20 38 47.37
#> 16 0 0 N/A
#> 17 0 0 N/A
#> 18 253 498 49.20
#> 19 1 1 0.00
#> 20 0 0 N/A
#> 21 3 3 0.00
#> 22 0 0 N/A
#> 23 40 86 53.49
#> 24 0 0 N/A
#> 25 19 28 32.14
#> 26 0 0 N/A
#> 27 1 1 0.00
#> 28
#> 29 0 0 N/A
#> 30 0 0 N/A
#> 31 0 0 N/A
#> 32 0 0 N/A
#> 33 8 13 38.46
#> 34 0 0 N/A
#> 35
#> 36 0 0 N/A
#> 37
#> 38
但是,dplyr::bind_rows()
不起作用。我认为这是因为列名不同。感兴趣的变量名称在第2行中。
如何将每个变量的列名设置为列表中每个元素的第二行的值?
我尝试过的是
url %>%
read_html() %>%
html_nodes('[class = "tblContent"]') %>%
html_table() %>%
magrittr::extract(c(TRUE, FALSE)) %>%
map(set_names, nm = slice(., 2))
但这不起作用。有什么想法吗?
答案 0 :(得分:1)
这是一个简短的函数,用于获取名称的第二行并删除前两行。
convertData = function(df) {
newnames = unlist(df[2, ], use.names = F)
df = df[3:nrow(df), ]
names(df) = newnames
return(df)
}
因此,您可以lapply()
将其保存到所有data.frames,然后将它们合并为1个data.frame。
list_ = url %>%
read_html() %>%
html_nodes('[class = "tblContent"]') %>%
html_table() %>%
magrittr::extract(c(TRUE, FALSE)) %>%
lapply(convertData) %>%
bind_rows()
答案 1 :(得分:1)
使用tidyverse
软件包的解决方案。假设您下载的数据帧列表称为dat_list
。 dat
是数据帧的最终输出。关键是使用第2行中的信息来重命名每个数据帧,并使用map_dfr
来组合每个单独的数据帧。
library(tidyverse)
library(rvest)
library(magrittr)
url <- "http://stats.swehockey.se/Teams/Info/PlayersByTeam/9301"
dat_list <- url %>%
read_html() %>%
html_nodes('[class = "tblContent"]') %>%
html_table() %>%
magrittr::extract(c(TRUE, FALSE))
dat <- dat_list %>%
map_dfr(function(x){
name_vec <- as.vector(x[2, ])
temp <- x %>%
setNames(name_vec) %>%
slice(3:n())
return(temp)
})