簡體   English   中英

根據行 ID 將“文件名”列分配給 dataframe

[英]Assign 'filename' column to dataframe based on row ID

我通過行綁定不同的網絡抓取表構建了一個數據框。

# 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) 

我想根據filelist從文件列表中創建一個具有相應名稱的新列company 公司名稱是_之間的第三個代碼。 要得到這樣的東西:

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

這可能是一個非常簡單的問題,但我對 R 中的函數還沒有信心。 我看過類似的問題並嘗試過:

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

沒有數據可以對此進行測試,但您可以嘗試以下操作:

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)

當我們使用bind_rows時,我們使用sapply with simplify = FALSE來獲取以filelist作為名稱的命名列表,該名稱被分配為新列company 我們使用正則表達式提取數據的相關部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM