Как поместить значения внутри столбца на основе других значений столбца в R - PullRequest
0 голосов
/ 29 ноября 2018

Я работаю с R, чтобы очистить и очистить данные для моей работы в качестве журналиста.Я мог бы получить таблицу HTML, затем прочитать ее как dataframe и переименовать имя столбца.Теперь я пытаюсь создать новый столбец, который получает значение с учетом значений других столбцов.

Этот новый столбец должен получить значения "Avante", "DEM", "MDB", "Patriota", "PCdoB "и так далее.Это партия каждого депутата.Например, в Аванте есть три заместителя: «Адальберто Кавальканти», «Кабо Сабино» и «Сильвио Коста».Имена депутатов всегда идут ниже целого ряда с названием партии.

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

Вот что у меня сейчас: введите описание изображения здесь

Это то, что я хочу: введите описание изображения здесь

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Вот еще один вариант использования zoo и dplyr.

1) Получить имена сторон.

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

2) Добавить parties в качестве нового столбцаи нести последнее замечание для слова, так как в parties[match(table1_df$deputado, parties)] есть много NA с.

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
0 голосов
/ 29 ноября 2018

Вот решение, которое использует только базу R:

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

# create the new column for later
table1_df$new_column <- NA

# identify rows with the Total PARTY: NUM rows
idx <- grep("Total.*: \\d+", table1_df$deputado)

# Loop over these and assign the values
for (i in seq_along(idx)){
  # Extract the number of deputados
  n <- as.numeric(sub("^.*: ", "", table1_df$deputado[idx[i]]))
  # Extract the party
  partido <- sub("Total ", "", table1_df$deputado[idx[i]])
  partido <- sub(": .*", "", partido)
  # Assign the values
  table1_df$new_column[(idx[i] - n):(idx[i] - 1)] <- partido
}

# Remove the unnecessary lines
table1_df <- table1_df[-grep("Total .*:.*", table1_df$deputado), ]
table1_df <- table1_df[-which(table1_df$deputado == table1_df$uf), ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...