将列名称设置为数据帧列表的第n行的值

时间:2018-07-05 14:09:38

标签: r dplyr data-cleaning purrr

我正在尝试绑定以下列表的行(由于字符限制,我将其缩短了,但是列表中有约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))

但这不起作用。有什么想法吗?

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_listdat是数据帧的最终输出。关键是使用第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)
  })