Разделите столбцы df на тот же столбец в R, но сохраните df.column.names - PullRequest
1 голос
/ 25 марта 2020

У меня есть этот фрейм данных, который представляет все муниципалитеты и партийные позиции

head(filtered_df,30)
              V1   V2
1         ABATIÁ  PDT
2         ABATIÁ  PSD
3         ABATIÁ  PHS
4         ABATIÁ   PP
...
9         ABATIÁ   PP
10        ABATIÁ PROS
11  ADRIANÓPOLIS  PSC
12  ADRIANÓPOLIS   PT
13  ADRIANÓPOLIS   PT
...
19  ADRIANÓPOLIS  PSC
20  ADRIANÓPOLIS  PSD
21 AGUDOS DO SUL PMDB
22 AGUDOS DO SUL PSDB
...
29 AGUDOS DO SUL  PSD
30 AGUDOS DO SUL PMDB

затем,

freq_partidos<- table(data_filtrado)
freq_municipio <- table(data_filtrado$V1)


> str(freq_partidos)
 'table' int [1:399, 1:30] 1 0 0 1 1 0 1 0 2 1 ...
 - attr(*, "dimnames")=List of 2
  ..$ V1: chr [1:399] "ABATIÁ" "ADRIANÓPOLIS" "AGUDOS DO SUL" "ALMIRANTE TAMANDARÉ" ...
  ..$ V2: chr [1:30] "DEM" "PC do B" "PDT" "PEN" ...
> str(freq_municipio)
 'table' int [1:399(1d)] 10 10 10 16 10 10 10 10 10 10 ...
 - attr(*, "dimnames")=List of 1
  ..$ : chr [1:399] "ABATIÁ" "ADRIANÓPOLIS" "AGUDOS DO SUL" "ALMIRANTE TAMANDARÉ" ...

Вот некоторые шоу

> head(freq_partidos)
                     V2
V1                    DEM PC do B PDT PEN PHS PMB PMDB PMN PP PPL PPS PR PRB PROS PRP PRTB PSB PSC
  ABATIÁ                1       0   2   0   1   0    1   0  2   0   0  0   0    1   0    0   0   0
  ADRIANÓPOLIS          0       0   1   0   0   0    0   0  0   0   0  0   0    0   0    0   0   5
  AGUDOS DO SUL         0       0   0   0   0   0    3   0  3   0   0  0   0    0   0    0   2   0
  ALMIRANTE TAMANDARÉ   1       0   0   1   1   1    1   0  1   0   0  0   2    1   0    0   1   0
  ALTAMIRA DO PARANÁ    1       0   0   1   0   0    0   0  1   0   2  0   0    0   0    0   2   0
  ALTO PARAÍSO          0       0   1   0   0   0    0   0  3   0   1  0   0    0   0    0   0   0
                     V2
> head(freq_municipio)

             ABATIÁ        ADRIANÓPOLIS       AGUDOS DO SUL ALMIRANTE TAMANDARÉ  ALTAMIRA DO PARANÁ 
                 10                  10                  10                  16                  10 
       ALTO PARAÍSO 
                 10 

Мне нужно чтобы разделить каждый столбец с freq_partidos на freq_municípios, но мне нужно знать, что это за каждый столбец, поэтому я должен перенести имена столбцов "freq_partidos" в мой новый df.

Я ищу окончательный результат, подобный этому:

                 DEM     PCdoB      PDT     PEN     PHS
ABATIÁ          1/10         0     2/10       0    1/10  
ADRIAN.            0         0     1/10       0       0

Как лучше это сделать?

1 Ответ

1 голос
/ 25 марта 2020

Мы можем сделать это за 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...