library(rvest)
link1 <- "https://www.house.kg/en/details/78672316222ed8865fd97-82358847"
link2 <- "https://www.house.kg/en/details/258564561fa0bd0854978-45745933"
house_link <- c(link1, link2)
house_features = lapply(houselink, function(link) {
page_data <-
tryCatch({
read_html(link)
pricing = page_data %>% html_nodes("h1") %>% html_text(trim = T)},
error = function(e) e,
warning = function(w) w)
if(!inherits(page_data, "error")) {
data.frame(
link = link,
parameters = page_data %>% html_nodes(".label") %>% html_text(trim = TRUE),
values = page_data %>% html_nodes(".info") %>% html_text(trim = TRUE)
)
list(
pricing = page_data %>% html_nodes("h1") %>% html_text(trim = T)
)
} else {
NULL
}
})
但是當我使用時do.call(rbind),它會產生錯誤。
do.call(rbind, house_features) %>%
group_by(link, parameters) %>%
mutate(parameters = if_else(row_number() > 1, paste(parameters,row_number()), parameters)) %>%
pivot_wider(id_cols = link, names_from = parameters, values_from = values)
其中一個鏈接有 19 個變數,而第二個鏈接僅包含 5 個變數。你看到了差異。如何將所有變數分別放入單獨的列?如果該變數沒有值,例如額外的 14 個變數,我想為變數的值添加 NA。我應該如何做到這一點,窺視?
uj5u.com熱心網友回復:
試試這個方法:
- 在串列中收集房屋特征
house_features = lapply(house_link, function(link) {
page_data <- tryCatch(read_html(link),error = function(e) e ,warning=function(w) w)
if(!inherits(page_data, "error")) {
data.frame(
link = link,
parameters = page_data %>% html_nodes(".label") %>% html_text(trim = TRUE),
values = page_data %>% html_nodes(".info") %>% html_text(trim = TRUE)
)
} else {
NULL
}
})
rbind他們使用do.call,確保引數名稱是唯一的(它們不是/例如 link1 有兩個引數稱為Floor),然后pivot_wider
do.call(rbind,house_features) %>%
group_by(link, parameters) %>%
mutate(parameters = if_else(row_number()>1, paste(parameters,row_number()), parameters)) %>%
pivot_wider(id_cols = link, names_from=parameters,values_from=values)
輸出:
link `Type of offer` Category House Floor Area Condition Internet Toilet Gas `Front door` Parking Furniture `Floor 2` `Ceiling height` Security Other `Possibility of…
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 https… from owner elite monol… 9 fl… 107 … european… optics 2 bat… trunk armored parking fully fu… laminate 3 m. bars on… plas… no
2 https… from agent NA panel… NA 255 … NA NA NA NA NA NA NA NA NA NA NA NA
# … with 4 more variables: Possibility of getting a mortgage <chr>, Possibility of exchange <chr>, Number of floors <chr>, Heating <chr>
uj5u.com熱心網友回復:
house_data <- do.call(rbind, house_features) %>%
group_by(link, parameters) %>%
mutate(parameters = if_else(row_number() > 1, paste(parameters,row_number()), parameters)) %>%
pivot_wider(
id_cols = c(link, pricing,), names_from = parameters, values_from = values)
我發現了什么?盡管變數pricing可能會導致資料幀之間的重復和冗余,如您所見,但lapply與傳統的 for 回圈相比,仍然 - 令人驚訝的是 - 函式以驚人的速度快速運行!
我的意思是,你有一整團蠟。謝謝@langtang :)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/442244.html
下一篇:如何用paste0處理變數?
