r语言 - 使用Tidyverse将数据从一个列转换为多个列



所以我抓取了一个网站,数据是这样的:

# A tibble: 150 x 1
data                                                                              
<chr>                                                                             
1 HELSFYR / HOVINENGA - Leilighet fra 2019 med balkong, garasjeplass og el-billading
2 Innspurten 10B, Oslo                                                              
3 56 m²17 500 kr                                                                    
4 Fin 3-roms leilighet til leie på Grunerløkka                                      
5 SANNERGATA 13 A, Oslo                                                             
6 55 m²14 200 kr                                                                    
7 Torshov Torg - Meget pen 3-roms med balkong Sandakerveien 22 B, 0473 Oslo         
8 SANDAKERVEIEN 22 B, Oslo                                                          
9 51 m²16 500 kr                                                                    
10 FROGNER/VIKA- 3-roms leilighet med god standard. Ledig 1 juli!                    
# ... with 140 more rows

它实际上包含我需要的三列。我如何将一列转换成多个,每1-3行分割成它们?期望的输出将是:

# A tibble: 3 x 3
title                                          adress                   info          
<chr>                                          <chr>                    <chr>         
1 "HELSFYR / HOVINENGA - Leilighet fra 2019 "    Innspurten 10B, Oslo     56 m²17 500 kr
2 "Fin 3-roms leilighet til leie på Grunerløkka" SANNERGATA 13 A, Oslo    55 m²14 200 kr
3 "Torshov Torg - Meget pen 3-roms med balko"    SANDAKERVEIEN 22 B, Oslo 51 m²16 500 kr

我的数据
Dput()
structure(list(data = c("HELSFYR / HOVINENGA - Leilighet fra 2019 med balkong, garasjeplass og el-billading", 
"Innspurten 10B, Oslo", "56 m²17 500 kr", "Fin 3-roms leilighet til leie på Grunerløkka", 
"SANNERGATA 13 A, Oslo", "55 m²14 200 kr", "Torshov Torg - Meget pen 3-roms med balkong Sandakerveien 22 B, 0473 Oslo", 
"SANDAKERVEIEN 22 B, Oslo", "51 m²16 500 kr")), row.names = c(NA, 
-9L), class = c("tbl_df", "tbl", "data.frame"))

你可以这样做:

df$data %>% 
matrix(nrow = 3) %>% 
t() %>% 
as.data.frame() %>% 
setNames(c("Title", "Address", "Info")) %>% 
as_tibble()
#> # A tibble: 3 x 3
#>   Title                                                            Address Info 
#>   <chr>                                                            <chr>   <chr>
#> 1 HELSFYR / HOVINENGA - Leilighet fra 2019 med balkong, garasjepl~ Innspu~ 56 m~
#> 2 Fin 3-roms leilighet til leie på Grunerløkka                     SANNER~ 55 m~
#> 3 Torshov Torg - Meget pen 3-roms med balkong Sandakerveien 22 B,~ SANDAK~ 51 m~

在2022-05-04由reprex包(v2.0.1)创建

我最喜欢@Allan Cameron的解决方案。以下是tidyverse方法:这将额外删除title列中逗号后面的所有内容:

library(dplyr)
library(tidyr)
library(stringr)
df %>% 
group_by(group = as.integer(gl(n(), 3, n()))) %>% 
summarise(helper = paste(data, collapse = "|")) %>% 
separate(helper, c("title", "adress", "info"), sep = "\|", remove = TRUE) %>% 
ungroup() %>% 
select(-group) %>% 
mutate(title = str_remove_all(title, '\,.*'))

title                                                          adress                   info          
<chr>                                                          <chr>                    <chr>         
1 HELSFYR / HOVINENGA - Leilighet fra 2019 med balkong           Innspurten 10B, Oslo     56 m²17 500 kr
2 Fin 3-roms leilighet til leie på Grunerløkka                   SANNERGATA 13 A, Oslo    55 m²14 200 kr
3 Torshov Torg - Meget pen 3-roms med balkong Sandakerveien 22 B SANDAKERVEIEN 22 B, Oslo 51 m²16 500 kr

您可以使用scan()函数并使用what参数来定义字段:

tibble::as_tibble(scan(text = df$data, what = list(title = "", address = "", info = ""), sep = "n"))
Read 3 records
# A tibble: 3 × 3
title                                                                              address                  info          
<chr>                                                                              <chr>                    <chr>         
1 HELSFYR / HOVINENGA - Leilighet fra 2019 med balkong, garasjeplass og el-billading Innspurten 10B, Oslo     56 m²17 500 kr
2 Fin 3-roms leilighet til leie på Grunerløkka                                       SANNERGATA 13 A, Oslo    55 m²14 200 kr
3 Torshov Torg - Meget pen 3-roms med balkong Sandakerveien 22 B, 0473 Oslo          SANDAKERVEIEN 22 B, Oslo 51 m²16 500 kr

你也可以在上游解决这个问题,同时抓取数据。

你可以这样做:

setNames(
bind_cols(lapply(1:3, function(i) data[seq(i,nrow(data),3),])),
c("title","address","info")
)

输出:

title                                                                              address                  info          
<chr>                                                                              <chr>                    <chr>         
1 HELSFYR / HOVINENGA - Leilighet fra 2019 med balkong, garasjeplass og el-billading Innspurten 10B, Oslo     56 m²17 500 kr
2 Fin 3-roms leilighet til leie på Grunerløkka                                       SANNERGATA 13 A, Oslo    55 m²14 200 kr
3 Torshov Torg - Meget pen 3-roms med balkong Sandakerveien 22 B, 0473 Oslo          SANDAKERVEIEN 22 B, Oslo 51 m²16 500 kr

相关内容

  • 没有找到相关文章

最新更新