如何基于R

时间:2018-11-29 20:01:35

标签: r dplyr tidyverse rvest data-cleaning

我正在与R一起为我作为记者的工作抓取并清理数据。我可以获取HTML的表,然后将其读取为数据框并重命名列的名称。现在,我正在尝试创建一个新列,该列考虑其他列的值来获取值。

此新列应获取“ Avante”,“ DEM”,“ MDB”,“ Patriota”,“ PCdoB”等值。这是每个副主席的聚会。例如,阿凡特(Avante)有三名代表,分别是“阿达伯托·卡瓦尔坎蒂”,“卡波·萨比诺”和“西尔维奥·科斯塔”。代表的姓名总是在一行的下面一行。

url <- "http://www.camara.leg.br/internet/votacao/mostraVotacao.asp?ideVotacao=8559&numLegislatura=55&codCasa=1&numSessaoLegislativa=4&indTipoSessaoLegislativa=O&numSessao=225&indTipoSessao=E&tipo=partido"

library(xml2)
library(rvest)
file <- read_html(url)
tables <- html_nodes(file, "table")
table1 <- html_table(tables[3], fill = TRUE, header = T)

head(table1)

table1_df <- as.data.frame(table1)

colnames(table1_df) <- c("deputado", "uf", "voto")

这就是我现在拥有的: enter image description here

这就是我想要的: enter image description here

2 个答案:

答案 0 :(得分:0)

这是仅使用基数R的解决方案:

create table #temptablei (partnum nvarchar(50), loc nvarchar(50), logtime 
smalldatetime, amt float)

insert into #temptablei (partnum,loc,logtime,amt)
    VALUES
    ('maa-0001','whs1','2018-11-29 11:00:00',288),
    ('maa-0001','whs1','2018-11-29 11:30:00',253),
    ('maa-0001','whs1','2018-11-29 12:00:00',294),
    ('maa-0001','whs1','2018-11-29 12:30:00',181),
    ('maa-0001','whs1','2018-11-29 13:00:00',200),
    ('maa-0001','whs1','2018-11-29 13:30:00',218)

select * from #temptablei

答案 1 :(得分:0)

这是使用zoodplyr的另一个选项。

1)获取各方名称。

parties <- sub(pattern = "Total\\s(.+):\\s\\d+", 
                replacement = "\\1", 
                x = table1_df$deputado[grepl("Total", x = table1_df$deputado)])

2)由于parties中有许多NA,因此将parties[match(table1_df$deputado, parties)]添加为新列,并携带最后的观测词。

table1_df$new_col <- zoo::na.locf(parties[match(table1_df$deputado, parties)])

3)删除不需要的行。

library(dplyr)
table1_df <- table1_df %>% 
  group_by(new_col) %>% 
  slice(2:(n()-1))
table1_df
# A tibble: 324 x 4
# Groups:   new_col [24]
#   deputado             uf    voto      new_col
#   <chr>                <chr> <chr>     <chr>  
# 1 Adalberto Cavalcanti PE    Não       Avante 
# 2 Cabo Sabino          CE    Abstenção Avante 
# 3 Silvio Costa         PE    Sim       Avante 
# 4 Alan Rick            AC    Sim       DEM    
# 5 Alberto Fraga        DF    Não       DEM    
# 6 Alexandre Leite      SP    Sim       DEM    
# 7 Arthur Oliveira Maia BA    Sim       DEM    
# 8 Carlos Melles        MG    Sim       DEM    
# 9 Efraim Filho         PB    Não       DEM    
#10 Eli Corrêa Filho     SP    Sim       DEM    
# ... with 314 more rows