【问题标题】:Assign 'filename' column to dataframe based on row ID根据行 ID 将“文件名”列分配给数据框
【发布时间】:2023-03-04 07:02:02
【问题描述】:

我已经构建了一个逐行绑定不同网络抓取表的数据框。

# html files
filelist <- c("Prod223_2688_00185641_20190930.html","Prod224_0078_SO305092_20191130.html", 
"Prod224_0078_SO305426_20190831.html", "Prod224_0078_SO305431_20190831.html", 
"Prod224_0078_SO305440_20190831.html", "Prod224_0078_SO305451_20200331.html", 
"Prod224_0078_SO306088_20190531.html", "Prod224_0078_SO306098_20180630.html", 
"Prod224_0078_SO306098_20190630.html", "Prod224_0078_SO306411_20190530.html")

# web scraping tables
mydata <- lapply(filelist, function(x) {
  read_html(x) %>% rvest::html_table(fill = T) %>% 
    dplyr::nth(2) 
})

# row binding (adding a new column with row .id)
mydata <- rbindlist(mydata, idcol=T, fill = T) 

我想根据行 .id 创建一个新列 company,其名称来自 filelist。公司名称是_ 之间的第三个代码。要得到这样的东西:

mydata
 company  id.  X2 ..
00185641    1  .. 
00185641    1  .. 
SO305092    2  .. 
SO305426    3  .. 
SO305426    3  .. 

这可能是一个非常简单的问题,但我对 R 中的函数还没有信心。我见过类似的questions 并尝试过:

mydata2 <- mydata2 %>% mutate(company=lapply(mydata2,filelist))
# and this:
mydata2$company <- rep(paste(filelist), length(mydata2$.id))

【问题讨论】:

    标签: r web-scraping


    【解决方案1】:

    没有数据可以对此进行测试,但您可以尝试以下方法:

    library(dplyr)
    library(rvest)
    
    mydata <- sapply(filelist, function(x) {
      read_html(x) %>% rvest::html_table(fill = TRUE) %>% 
        dplyr::nth(2) 
    }, simplify = FALSE)
    
    mydata <- bind_rows(mydata, .id = ='company')
    mydata$company <- sub('.*_(\\w+)_\\w+', '\\1', mydata$company)
    

    我们使用sapplysimplify = FALSE 来获得一个以filelist 作为名称的命名列表,当我们使用bind_rows 时,该名称被分配为一个新列company。我们使用正则表达式提取数据的相关部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-16
      • 1970-01-01
      相关资源
      最近更新 更多