使用 ifelse 和 case_when 函数分组信息的问题

问题描述

我正在尝试将巴西每个州中包含的信息分组到区域中。 最初我通过函数 table 检查这些在每个州的分布。

数据:https://drive.google.com/file/d/1x7pD2yH-u3EZk5TB_bjKzkqyX3K1H-Tv/view?usp=sharing

table(Dados$Estado)
               ACRE             ALAGOAS 
                574                2184 
              AMAPÁ            AMAZONAS 
                728                2624 
              BAHIA               CEARÁ 
               9818                5694 
   disTRITO FEDERAL      ESPÍRITO SANTO 
              17497                4289 
              GOIÁS            MaraNHÃO 
               5896                2705 
        MATO GROSSO  MATO GROSSO DO SUL 
               2984                2683 
       MINAS GERAIS                PARÁ 
              20858                4714 
            ParaÍBA              ParaNÁ 
               3428               10608 
         PERNAMBUCO               PIAUÍ 
               6599                1908 
     RIO DE JANEIRO RIO GRANDE DO norTE 
              26787                2858 
  RIO GRANDE DO SUL            RONDÔNIA 
              11739                1665 
            RORaimA      SANTA CATARINA 
                514                7246 
          SÃO PAULO             SERGIPE 
              51701                1693 
          TOCANTINS 
               1209 

为了完成我想要的,我最初尝试使用 ifelse 字符串如下按地区分组的州,它没有正确显示值,也就是说,计数应该更高,因为我将每个州分组到各自的地区。我也试过使用table包的case_when函数,但是问题依旧。

dplyr
Dados$Regioes <- ifelse(Dados$Estado == c("SÃO PAULO","MINAS GERAIS","ESPÍRITO SANTO","RIO DE JANEIRO"),"Sudeste",ifelse(Dados$Estado == c("ParaNÁ","SANTA CATARINA","RIO GRANDE DO SUL"),"Sul",ifelse(Dados$Estado == c("MATO GROSSO DO SUL","MATO GROSSO","GOIÁS","disTRITO FEDERAL"),"Centro-Oeste",ifelse(Dados$Estado == c("AMAZONAS","ACRE","RONDÔNIA","RORaimA","PARÁ","TOCANTINS","AMAPÁ"),"norte",ifelse(Dados$Estado == c("BAHIA","SERGIPE","ALAGOAS","PERNAMBUCO","ParaÍBA","RIO GRANDE DO norTE","CEARÁ","PIAUÍ","MaraNHÃO"),"nordeste",NA)))))
table(Dados$Regioes)
Centro-Oeste     nordeste        norte 
        7338         4052         1707 
     Sudeste          Sul 
       25786         9892

解决方法

您可以简化添加 Regioes 的过程,但您似乎也遇到了数据中字符集编码的问题。我使用以下代码读取了您的数据:

Dados <- read.csv(file.choose(),sep=";",encoding="latin1")

现在,创建一个包含状态和区域的数据框:

Regioes.df <-  rbind(cbind(Estado= c("SÃO PAULO","MINAS GERAIS","ESPÍRITO SANTO","RIO DE JANEIRO"),Regioes=rep("Sudeste",4)),cbind(Estado=c("PARANÁ","SANTA CATARINA","RIO GRANDE DO SUL"),Regioes=rep("Sul",3)),cbind(Estado=c("MATO GROSSO DO SUL","MATO GROSSO","GOIÁS","DISTRITO FEDERAL"),Regioes=rep("Centro-Oeste",cbind(Estado=c("AMAZONAS","ACRE","RONDÔNIA","RORAIMA","PARÁ","TOCANTINS","AMAPÁ"),Regioes=rep("Norte",7)),cbind(Estado=c("BAHIA","SERGIPE","ALAGOAS","PERNAMBUCO","PARAÍBA","RIO GRANDE DO NORTE","CEARÁ","PIAUÍ","MARANHÃO"),Regioes=rep("Nordeste",9)))

现在与您的原始数据合并并制成表格:

Dados.Reg <- merge(Dados,Regioes.df,all=TRUE)
table(Dados.Reg$Estado,Dados.Reg$Regioes,useNA="ifany")

                    # Centro-Oeste Nordeste Norte Sudeste   Sul  <NA>
  # ACRE                           0        0   574       0     0     0
  # ALAGOAS                        0     2184     0       0     0     0
  # AMAPÁ                          0        0   728       0     0     0
  # AMAZONAS                       0        0  2624       0     0     0
  # BAHIA                          0     9818     0       0     0     0
  # CEARÁ                          0     5694     0       0     0     0
  # DISTRITO FEDERAL           17497        0     0       0     0     0
  # ESPÍRITO SANTO                 0        0     0    1030     0  3259   <====
  # GOIÁS                       5896        0     0       0     0     0
  # MARANHÃO                       0     2705     0       0     0     0
  # MATO GROSSO                 2984        0     0       0     0     0
  # MATO GROSSO DO SUL          2683        0     0       0     0     0
  # MINAS GERAIS                   0        0     0    5340     0 15518   <===
  # PARÁ                           0        0  4714       0     0     0
  # PARAÍBA                        0     3428     0       0     0     0
  # PARANÁ                         0        0     0       0 10608     0
  # PERNAMBUCO                     0     6599     0       0     0     0
  # PIAUÍ                          0     1908     0       0     0     0
  # RIO DE JANEIRO                 0        0     0    6666     0 20121   <===
  # RIO GRANDE DO NORTE            0     2858     0       0     0     0
  # RIO GRANDE DO SUL              0        0     0       0 11739     0
  # RONDÔNIA                       0        0  1665       0     0     0
  # RORAIMA                        0        0   514       0     0     0
  # SANTA CATARINA                 0        0     0       0  7246     0
  # SÃO PAULO                      0        0     0   12750     0 38951   <===
  # SERGIPE                        0     1693     0       0     0     0
  # TOCANTINS                      0        0  1209       0     0     0

正如您从表中看到的那样,四个州的行没有被正确识别,因此区域丢失。这就是您的表格不匹配的原因。