【问题标题】:Setting names of df with character vector that is a different length使用不同长度的字符向量设置 df 的名称
【发布时间】:2020-02-15 19:51:21
【问题描述】:

我在为从网站上抓取的 df 设置名称时遇到问题。 html_table 有一堆没有正确列名的列。当我使用purrr::set_names 时,我收到一条错误消息,因为被刮掉的列与html_table 上的列长度不同。有没有人能想到的解决这个问题的方法?缺少的列集似乎是重复数据。它们与data 中的5:10 列相同。示例如下:

library(tidyverse)
# url
url <- "https://legacy.baseballprospectus.com/pitchfx/leaderboards/index.php?hand=&reportType=avg&prp=P&month=&year=2019&pitch=FS&ds=&lim=0"

# get page from URL
page <-
  url %>%
  xml2::read_html()

# get df from page
data <-
  page %>%
  rvest::html_table(fill = TRUE) %>%
  .[[2]] %>%
  data.frame(stringsAsFactors = FALSE) %>%
  tbl_df()

# get column names
names <-
  page %>%
  rvest::html_node("thead") %>%
  rvest::html_nodes("th") %>%
  rvest::html_text() %>%
  stringr::str_trim()

# Add Column names since Scrape does not include
df <-
  data %>%
  purrr::set_names(names)
#> `nm` must be `NULL` or a character vector the same length as `x`
Created on 2019-10-18 by the reprex package (v0.3.0)

【问题讨论】:

    标签: r rvest purrr


    【解决方案1】:

    问题是nameslength 与“数据”的列数不匹配。根据?set_names

    set_names(x, nm = x, ...)

    x- 要命名的向量。

    ... - 名称向量,长度与 x 相同。

    因为它需要相同的length,而这里不是这样,它会抛出一个错误。

    一种选择是使用rename_at。如果我们知道列位置索引或列名,则将其传递给rename_atvars 并更改列名

    library(dplyr)
    data %>%
         rename_at(seq_len(length(names)), ~ names)
    

    【讨论】:

    • 谢谢!有时间使用 set_names 与 rename_at 吗?两种方法的优缺点?
    • @Jazzmatazz。如果要更改整个数据集名称,set_names 很好。 (setnames 来自data.table 确实更改了列名的子集),否则,可以使用rename_atrename_all 也用于更改所有列名)
    • @Jazzmatazz。使用rename_at 的优点之一是通过添加后缀/前缀更容易修改现有列名,即mtcars %&gt;% rename_at(1:2, ~ paste0(.x, "hello"))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-30
    • 2016-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多