[R-br] Ajuda com a passagem incorreta de variável string para uma função do R

Cesar Rabak cesar.rabak em gmail.com
Sex Jan 18 17:09:37 -02 2019


Bruno,

Com as provisões de adequação do exemplo e demais considerações, *acho* obtive
que a resposta que você deseja fazendo o seguinte:

1) na criação das data.tables perc_validos e votos_regiao eu coloquei que a
chave para ambas era a região com o parâmetro Key="Regiao".

2) usando a seguinte chamada obtive o seguinte (ignore o fato que meu R é
parametrizado para português e a vírgula usada como marca de raíz):

> merge(perc_validos, votos_regiao[,Regiao,"Demais Candidatos"], all.x=T,
sort=T) # isto aqui é tudo uma linha só!!
          Regiao              Estado Bolsonaro Haddad   Ciro Outros
 1: Centro-Oeste    Distrito Federal    0,5837 0,1187 0,1660 0,1316
 2: Centro-Oeste               Goias    0,5724 0,2186 0,0860 0,1230
 3: Centro-Oeste         Mato Grosso    0,6004 0,2476 0,0559 0,0961
 4: Centro-Oeste  Mato Grosso do Sul    0,5506 0,2387 0,0804 0,1304
 5:     Exterior                        0,5879 0,1010 0,1452 0,1659
 6:     Nordeste             Alagoas    0,3440 0,4475 0,1012 0,1072
 7:     Nordeste               Bahia    0,2341 0,6028 0,0941 0,0690
 8:     Nordeste               Ceara    0,2174 0,3312 0,4095 0,0419
 9:     Nordeste            Maranhao    0,2428 0,6126 0,0839 0,0606
10:     Nordeste             Paraiba    0,3130 0,4546 0,1675 0,0650
11:     Nordeste          Pernambuco    0,3057 0,4887 0,1356 0,0700
12:     Nordeste               Piaui    0,1876 0,6340 0,1142 0,0642
13:     Nordeste Rio Grande do Norte    0,3021 0,4119 0,2231 0,0631
14:     Nordeste             Sergipe    0,2721 0,5009 0,1302 0,0967
15:        Norte                Acre    0,6224 0,1853 0,0517 0,1405
16:        Norte               Amapa    0,4074 0,3277 0,1234 0,1417
17:        Norte            Amazonas    0,4348 0,4030 0,0750 0,0873
18:        Norte                Para    0,3619 0,4139 0,1003 0,1237
19:        Norte            Rondonia    0,6224 0,2036 0,0603 0,1739
20:        Norte             Roraima    0,6297 0,1785 0,0536 0,1383
21:        Norte           Tocantins    0,4464 0,4112 0,0717 0,0707
22:      Sudeste      Espirito Santo    0,5476 0,2420 0,0954 0,1149
23:      Sudeste        Minas Gerais    0,4831 0,2765 0,1164 0,1241
24:      Sudeste      Rio de Janeiro    0,5979 0,1469 0,1522 0,1030
25:      Sudeste           Sao Paulo    0,5300 0,1642 0,1135 0,1922
26:          Sul              Parana    0,5689 0,1970 0,0831 0,1510
27:          Sul   Rio Grande do Sul    0,5263 0,2281 0,1137 0,1318
28:          Sul      Santa Catarina    0,6582 0,1513 0,0668 0,1236
          Regiao              Estado Bolsonaro Haddad   Ciro Outros
    Demais Candidatos
 1:            952142
 2:            952142
 3:            952142
 4:            952142
 5:             32078
 6:           1894092
 7:           1894092
 8:           1894092
 9:           1894092
10:           1894092
11:           1894092
12:           1894092
13:           1894092
14:           1894092
15:            982103
16:            982103
17:            982103
18:            982103
19:            982103
20:            982103
21:            982103
22:           6968773
23:           6968773
24:           6968773
25:           6968773
26:           2258047
27:           2258047
28:           2258047
    Demais Candidatos
>

HTH
--
Cesar Rabak


On Fri, Jan 18, 2019 at 9:19 AM Bruno César Pasquini por (R-br) <
r-br em listas.c3sl.ufpr.br> wrote:

> *César*,
>
> Bom dia.
>
> Eu reconheço que, sob o aspecto de banco de dados, não faz sentido ter a
> mescla de proporções com totais absolutos de votos válidos. E que também
> acabo duplicando os valores no cruzamento. Meu exemplo não foi bom neste
> sentido.
>
> Ainda assim, a dúvida continua sendo como fazer a função reconhecer a
> variável que eu gostaria de levar para o cruzamento além da variável chave
> para o cruzamento (neste caso a variavel *Regiao*).
>
> Assim, ignorando estes problemas de bancos de dados, o que preciso fazer
> para passar o parâmetro da função de forma correta? Você(s) pode(m) me
> apontar o que estou fazendo de errado nas versões da função *consolida*?
>
> Grato mais uma vez pela sua atenção,
>
> Bruno César Pasquini
> Estatístico
>
>
> Em ter, 15 de jan de 2019 às 22:31, Cesar Rabak <cesar.rabak em gmail.com>
> escreveu:
>
>> Bruno,
>>
>> *Acho* que estou começando a entender a sua demanda, mas para ter
>> certeza é necessário ainda elicitar umas coisinhas:
>>
>> a) No exemplo que você passa como resultado desejado você tem uma mescla
>> de proporções com totais absolutos dos votos para a nova coluna oriunda da
>> operação de mescla;
>>
>> b) Como você usa Região como a chave comum entre as duas tabelas, os
>> valores de contagem de votos são repetidos pois na tabela perc_validos
>> a região é subdividida por UF enquanto na tabela votos_regiao há apenas
>> o agregado e não a quebra por UF.
>>
>> O resultado dessa forma faz sentido para você e é exatamente o que você
>> deseja da operação da sua função Consolida?
>>
>> HTH
>> --
>> Cesar Rabak
>>
>>
>> On Tue, Jan 15, 2019 at 8:01 AM Bruno César Pasquini por (R-br) <
>> r-br em listas.c3sl.ufpr.br> wrote:
>>
>>> *Daniel* e *César*,
>>>
>>> Agradeço muito o terem tentado rodar meu código...
>>>
>>> Arranjei este exemplo para tentar resolver um problema que estou tendo
>>> com dados da indústria química alemã onde trabalho, dados que não posso
>>> expor aqui. Arranjei um exemplo fake (ainda que com dados reais) para pedir
>>> a ajuda no processamento da função.
>>>
>>> Minha expectativa é a de conseguir que o R selecione apenas a variável
>>> chave para o cruzamento (*Regiao*) mais alguma outra (uma das colunas
>>> com contagem de votos) cuja interpretação não estou conseguindo acertar no
>>> meu código R.
>>>
>>> Como o problema é este, eu deixei os nomes das demais variáveis
>>> propositalmente diferentes, eu não espero mesmo que o R associe uma
>>> variável chamada "Ciro" com outra que se chama "Ciro Gomes" (a menos que eu
>>> o faça manualmente depois...).
>>>
>>> O que eu gostaria de obter neste cruzamento a ser feito pela função é
>>> algo como (vamos supor que peça a coluna dos votos dos demais candidatos):
>>>
>>> Regiao Estado Bolsonaro Haddad Ciro Outros 'Demais Candidatos'
>>> 'Centro-Oeste' 'Distrito Federal' 0.5837 0.1187 0.1660 0.1316 952142
>>> 'Centro-Oeste' 'Goias' 0.5724 0.2186 0.0860 0.1230 952142
>>> 'Centro-Oeste' 'Mato Grosso' 0.6004 0.2476 0.0559 0.0961 952142
>>> 'Centro-Oeste' 'Mato Grosso do Sul' 0.5506 0.2387 0.0804 0.1304 952142
>>> 'Exterior' '' 0.5879 0.1010 0.1452 0.1659 32078
>>> 'Nordeste' 'Alagoas' 0.3440 0.4475 0.1012 0.1072 1894092
>>> 'Nordeste' 'Bahia' 0.2341 0.6028 0.0941 0.0690 1894092
>>> 'Nordeste' 'Ceara' 0.2174 0.3312 0.4095 0.0419 1894092
>>> (...)
>>> É a tabela *perc_validos* com o acréscimo da coluna "Demais Candidatos".
>>>
>>> Meu desafio é separar, dentre as várias colunas na tabela *votos_regiao*,
>>> apenas a coluna chave (*Regiao*) e a coluna que eu apontar como
>>> parametro na função (neste exemplo acima a "Demais Candidatos"). Da maneira
>>> que coloquei (as 3 versões da função *consolida*), nenhuma delas tem
>>> funcionado e é nisso que eu preciso da ajuda para entender no que estou
>>> errando. O fato de gerar duplicidades e de que (no exemplo acima) a coluna
>>> "Outros" não se relacionar com a coluna "Demais Candidatos" nao são
>>> problema, eu tratarei na sequência do meu código. Para mim o importante é
>>> acertar a seleção para o cruzamento...
>>>
>>> Assim, como eu faço para selecionar uma das colunas com contagem de
>>> votos além da variável chave nas funções? O que eu estou fazendo de errado?
>>>
>>> Grato mais uma vez pela atenção de vocês,
>>>
>>> Bruno César Pasquini
>>> Estatístico.
>>>
>>>
>>> Em sex, 11 de jan de 2019 às 23:37, Cesar Rabak por (R-br) <
>>> r-br em listas.c3sl.ufpr.br> escreveu:
>>>
>>>> Bruno, apenas uma dúvida: como você espera fazer um *merge* em dois
>>>> conjuntos de dados cujas "chaves" (no data.table, que um dataframe) as
>>>> variáveis ou colunas... ou sendo mais simplório: como você espera que o SW
>>>> estatístico *saiba* que  Bolsonaro na data.table  perc_validos é a *mesma
>>>> coisa* que 'Jair Bolsonaro' na votos_regiao 🤔??
>>>>
>>>> HTH
>>>> --
>>>> Cesar Rabak
>>>>
>>>>
>>>> On Fri, Jan 11, 2019 at 9:17 AM Bruno César Pasquini por (R-br) <
>>>> r-br em listas.c3sl.ufpr.br> wrote:
>>>>
>>>>> PessoALL, bom dia!
>>>>>
>>>>> Estou com dificuldade em passar os valores de uma variável string para
>>>>> uma função do R de forma que esta função a interprete corretamente.
>>>>>
>>>>> Por exemplo, para indicar qual coluna eu quero que a função selecione
>>>>> para um cruzamento de 2 data.tables (acho melhor que usar data.frames pela
>>>>> melhor performance do data.table)... Eu poderia levar a tabela inteira para
>>>>> o cruzamento, mas depois teria que deletar as demais colunas manualmente,
>>>>> gostaria de resolver com a função conforme o exemplo abaixo.
>>>>>
>>>>> Construí este exemplo baseado nos resultados do primeiro turno das
>>>>> últimas eleições presidenciais. Normalmente eu importaria as tabelas, mas
>>>>> eu as declaro aqui para a devida reprodução do código.
>>>>> Fonte:
>>>>> https://pt.wikipedia.org/wiki/Resultados_da_eleição_presidencial_no_Brasil_em_2018#Primeiro_turno_3
>>>>>
>>>>> Meu propósito é entender o que estou fazendo de errado (ou deixando de
>>>>> fazer...), não estou propondo um debate político-ideológico que foge ao
>>>>> escopo desta lista...
>>>>>
>>>>> Especificamente, eu não consigo fazer a função "*consolida*" (na
>>>>> verdade as versões 1, 2 e 3 desta função) interprete(m) o parâmetro "
>>>>> *Candidato*" corretamente.
>>>>> Eu tento usar o parâmetro sozinho e com as funções "*substitute*" e "
>>>>> *eval*", mas não consigo levar a coluna com os números de votação do
>>>>> candidato por região para o cruzamento. Sim, eu sei que o cruzamento como o
>>>>> desenhei vai gerar duplicidade, mas o que preciso é que o cruzamento
>>>>> "funcione"...
>>>>>
>>>>> Vocês podem me ajudar a entender o que estou fazendo de errado?
>>>>>
>>>>> Muito grato pela atenção de cada um(a),
>>>>> Bruno César Pasquini
>>>>> Estatístico
>>>>>
>>>>> ####### Codigo Reprodutivel...
>>>>>
>>>>> library(data.table)
>>>>>
>>>>> ### Percentual de Votos Validos nos estados e no exterior...
>>>>> perc_validos <- data.table(Regiao = c('Centro-Oeste', 'Centro-Oeste',
>>>>> 'Centro-Oeste', 'Centro-Oeste', 'Exterior', 'Nordeste', 'Nordeste',
>>>>> 'Nordeste', 'Nordeste', 'Nordeste', 'Nordeste', 'Nordeste', 'Nordeste',
>>>>> 'Nordeste', 'Norte', 'Norte', 'Norte', 'Norte', 'Norte', 'Norte', 'Norte',
>>>>> 'Sudeste', 'Sudeste', 'Sudeste', 'Sudeste', 'Sul', 'Sul', 'Sul'),
>>>>>                            Estado = c('Distrito Federal', 'Goias',
>>>>> 'Mato Grosso', 'Mato Grosso do Sul', '', 'Alagoas', 'Bahia', 'Ceara',
>>>>> 'Maranhao', 'Paraiba', 'Pernambuco', 'Piaui', 'Rio Grande do Norte',
>>>>> 'Sergipe', 'Acre', 'Amapa', 'Amazonas', 'Para', 'Rondonia', 'Roraima',
>>>>> 'Tocantins', 'Espirito Santo', 'Minas Gerais', 'Rio de Janeiro', 'Sao
>>>>> Paulo', 'Parana', 'Rio Grande do Sul', 'Santa Catarina'),
>>>>>                            Bolsonaro = c(0.5837, 0.5724, 0.6004,
>>>>> 0.5506, 0.5879, 0.3440, 0.2341, 0.2174, 0.2428, 0.3130, 0.3057, 0.1876,
>>>>> 0.3021, 0.2721, 0.6224, 0.4074, 0.4348, 0.3619, 0.6224, 0.6297, 0.4464,
>>>>> 0.5476, 0.4831, 0.5979, 0.5300, 0.5689, 0.5263, 0.6582),
>>>>>                            Haddad = c(0.1187, 0.2186, 0.2476, 0.2387,
>>>>> 0.1010, 0.4475, 0.6028, 0.3312, 0.6126, 0.4546, 0.4887, 0.6340, 0.4119,
>>>>> 0.5009, 0.1853, 0.3277, 0.4030, 0.4139, 0.2036, 0.1785, 0.4112, 0.2420,
>>>>> 0.2765, 0.1469, 0.1642, 0.1970, 0.2281, 0.1513),
>>>>>                            Ciro = c(0.1660, 0.0860, 0.0559, 0.0804,
>>>>> 0.1452, 0.1012, 0.0941, 0.4095, 0.0839, 0.1675, 0.1356, 0.1142, 0.2231,
>>>>> 0.1302, 0.0517, 0.1234, 0.0750, 0.1003, 0.0603, 0.0536, 0.0717, 0.0954,
>>>>> 0.1164, 0.1522, 0.1135, 0.0831, 0.1137, 0.0668),
>>>>>                            Outros = c(0.1316, 0.1230, 0.0961, 0.1304,
>>>>> 0.1659, 0.1072, 0.0690, 0.0419, 0.0606, 0.0650, 0.0700, 0.0642, 0.0631,
>>>>> 0.0967, 0.1405, 0.1417, 0.0873, 0.1237, 0.1739, 0.1383, 0.0707, 0.1149,
>>>>> 0.1241, 0.1030, 0.1922, 0.1510, 0.1318, 0.1236)
>>>>>                            )
>>>>> ### Analisando o data.table perc_validos...
>>>>> perc_validos; class(perc_validos); str(perc_validos); dim(perc_validos)
>>>>>
>>>>> ### Total de Votos Validos por regiao e no exterior...
>>>>> votos_regiao <- data.table(Regiao = c('Centro-Oeste', 'Exterior',
>>>>> 'Nordeste', 'Norte', 'Sudeste', 'Sul'),
>>>>>                            'Jair Bolsonaro' = c(4555415, 113690,
>>>>> 7453186, 3785038, 23915925, 9453736),
>>>>>                            'Fernando Haddad' = c(1642054, 19540,
>>>>> 14583334, 3211002, 8623232, 3262843),
>>>>>                            'Ciro Gomes' = c(750776, 28073, 4892961,
>>>>> 748170, 5425104, 1499282),
>>>>>                            'Demais Candidatos' = c(952142, 32078,
>>>>> 1894092, 982103, 6968773, 2258047)
>>>>>                            )
>>>>> ### Analisando o data.table votos_regiao...
>>>>> votos_regiao; class(votos_regiao); str(votos_regiao); dim(votos_regiao)
>>>>>
>>>>> ### Fazendo o cruzamento... Ou pelo menos tentando...
>>>>> consolida1 <- function(Candidato) {
>>>>>    temporario <- merge(x = perc_validos,
>>>>>                        y = votos_regiao[, .(Regiao,
>>>>>                                             Candidato)],
>>>>>                        by = "Regiao",
>>>>>                        all.x = TRUE,
>>>>>                        sort = TRUE)
>>>>>    return(temporario)
>>>>> }
>>>>> consolida1(Candidato = "Jair Bolsonaro")
>>>>>
>>>>> consolida2 <- function(Candidato) {
>>>>>    temporario <- merge(x = perc_validos,
>>>>>                        y = votos_regiao[, .(Regiao,
>>>>>                                             substitute(Candidato))],
>>>>>                        by = "Regiao",
>>>>>                        all.x = TRUE,
>>>>>                        sort = TRUE)
>>>>>    return(temporario)
>>>>> }
>>>>> consolida2(Candidato = "Ciro Gomes")
>>>>>
>>>>> consolida3 <- function(Candidato) {
>>>>>    temporario <- merge(x = perc_validos,
>>>>>                        y = votos_regiao[, .(Regiao,
>>>>>                                             eval(Candidato))],
>>>>>                        by = "Regiao",
>>>>>                        all.x = TRUE,
>>>>>                        sort = TRUE)
>>>>>    return(temporario)
>>>>> }
>>>>> consolida3(Candidato = "Fernando Haddad")
>>>>>
>>>>> _______________________________________________
>>>>> R-br mailing list
>>>>> R-br em listas.c3sl.ufpr.br
>>>>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>>>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
>>>>> código mínimo reproduzível.
>>>>
>>>> _______________________________________________
>>>> R-br mailing list
>>>> R-br em listas.c3sl.ufpr.br
>>>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
>>>> código mínimo reproduzível.
>>>
>>> _______________________________________________
>>> R-br mailing list
>>> R-br em listas.c3sl.ufpr.br
>>> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
>>> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
>>> código mínimo reproduzível.
>>
>> _______________________________________________
> R-br mailing list
> R-br em listas.c3sl.ufpr.br
> https://listas.inf.ufpr.br/cgi-bin/mailman/listinfo/r-br
> Leia o guia de postagem (http://www.leg.ufpr.br/r-br-guia) e forneça
> código mínimo reproduzível.
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://listas.inf.ufpr.br/pipermail/r-br/attachments/20190118/0e71389e/attachment.html>


Mais detalhes sobre a lista de discussão R-br