Мы можем сделать это за tidyverse
. Сгруппированные по 'V1', создайте столбец частоты 'n', затем сгруппируйте по 'V2' и 'n' вместе с 'V1', снова получите частоту ('n1'), разделите 'n1' на 'n' после ungroup
ing, а затем преобразуйте «длинный» формат в «широкий» формат с помощью pivot_wider
(при необходимости столбец «V1» можно преобразовать в имена строк с помощью %>% tibble::column_to_rownames('V1')
library(dplyr)
library(tidyr)
data_filtrado %>%
group_by(V1) %>%
mutate(n = n()) %>%
group_by(V2, n, add = TRUE) %>%
summarise(n1 = n()) %>%
ungroup %>%
mutate(prop = n1/n) %>%
select(-n, -n1) %>%
pivot_wider(names_from = V2, values_from = prop,
values_fill = list(prop = 0))
# A tibble: 3 x 10
# V1 PDT PHS PP PROS PSD PSC PT PMDB PSDB
# <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 ABATIÁ 0.167 0.167 0.333 0.167 0.167 0 0 0 0
#2 ADRIANÓPOLIS 0 0 0 0 0.2 0.4 0.4 0 0
#3 AGUDOS DO SUL 0 0 0 0 0.25 0 0 0.5 0.25
Обновление
Используя данные OP, получается:
# A tibble: 399 x 31
# V1 DEM PDT PHS PMDB PP PROS PSD PTB PSC PT SD PSB PSDB PEN PMB PRB
# <fct> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 ABAT… 0.1 0.2 0.1 0.1 0.2 0.1 0.1 0.1 0 0 0 0 0 0 0 0
# 2 ADRI… 0 0.1 0 0 0 0 0.1 0 0.5 0.2 0.1 0 0 0 0 0
# 3 AGUD… 0 0 0 0.3 0.3 0 0.1 0 0 0 0 0.2 0.1 0 0 0
# 4 ALMI… 0.0625 0 0.0625 0.0625 0.0625 0.0625 0.125 0 0 0 0.0625 0.0625 0.0625 0.0625 0.0625 0.125
# 5 ALTA… 0.1 0 0 0 0.1 0 0 0 0 0.1 0.1 0.2 0.1 0.1 0 0
# 6 ALTO… 0 0.1 0 0 0.3 0 0.1 0 0 0.1 0 0 0.1 0 0 0
# 7 ALTO… 0.1 0.1 0 0.1 0 0 0 0.1 0 0.1 0 0 0.2 0 0 0
# 8 ALTO… 0 0 0 0 0.1 0 0.1 0.1 0 0 0 0.1 0.1 0 0 0
# 9 ALTÔ… 0.2 0.2 0.1 0 0.1 0 0.1 0 0 0 0 0.2 0.1 0 0 0
#10 ALVO… 0.1 0.2 0 0.3 0.1 0 0 0 0.1 0 0 0 0.1 0 0 0
# … with 389 more rows, and 14 more variables: PSL <dbl>, PV <dbl>, PPS <dbl>, PR <dbl>, PTN <dbl>, PMN <dbl>,
# PPL <dbl>, REDE <dbl>, PSDC <dbl>, PRP <dbl>, PRTB <dbl>, PTC <dbl>, `PT do B` <dbl>, `PC do B` <dbl>
Или, используя base R
, из кода OP, скопируйте 'freq_municipio', чтобы сделать длины одинаковыми, и выполните деление
dfnew <- freq_partidos/as.vector(freq_municipio[row(freq_partidos)])
df_new
# V2
#V1 PDT PHS PMDB PP PROS PSC PSD PSDB PT
# ABATIÁ 0.1666667 0.1666667 0.0000000 0.3333333 0.1666667 0.0000000 0.1666667 0.0000000 0.0000000
# ADRIANÓPOLIS 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.4000000 0.2000000 0.0000000 0.4000000
# AGUDOS DO SUL 0.0000000 0.0000000 0.5000000 0.0000000 0.0000000 0.0000000 0.2500000 0.2500000 0.0000000
Обновление
Использование данных OP
dfnew[1:3, 1:5]
# V2
#V1 DEM PC do B PDT PEN PHS
# ABATIÁ 0.1 0.0 0.2 0.0 0.1
# ADRIANÓPOLIS 0.0 0.0 0.1 0.0 0.0
# AGUDOS DO SUL 0.0 0.0 0.0 0.0 0.0
data
data_filtrado <- structure(list(V1 = c("ABATIÁ", "ABATIÁ", "ABATIÁ", "ABATIÁ",
"ABATIÁ", "ABATIÁ", "ADRIANÓPOLIS", "ADRIANÓPOLIS", "ADRIANÓPOLIS",
"ADRIANÓPOLIS", "ADRIANÓPOLIS", "AGUDOS DO SUL", "AGUDOS DO SUL",
"AGUDOS DO SUL", "AGUDOS DO SUL"), V2 = c("PDT", "PSD", "PHS",
"PP", "PP", "PROS", "PSC", "PT", "PT", "PSC", "PSD", "PMDB",
"PSDB", "PSD", "PMDB")), class = "data.frame", row.names = c("1",
"2", "3", "4", "9", "10", "11", "12", "13", "19", "20", "21",
"22", "29", "30"))
freq_partidos<- table(data_filtrado)
freq_municipio <- table(data_filtrado$V1)