poorman: Selecione ajudantes, correções e testes, testes, testes!

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


[Esteartigofoipublicadopelaprimeiravezem[Thisarticlewasfirstpublishedon Random R Ramblings, e gentilmente contribuiu para os R-blogueiros]. (Você pode relatar um problema sobre o conteúdo desta página aqui)


Deseja compartilhar seu conteúdo com R-blogueiros? clique aqui se você tiver um blog ou aqui se não tiver.

Olá a todos e bem-vindos a mais uma edição do poorman série de postagens do blog. Nesta série, estou discutindo meu progresso ao escrever um base R equivalente a dplyr. O que é legal nessa série é que, se você não curte poorman e prefere apenas usar dplyr, então está tudo bem! Destacando poorman funcionalidade, essa série de postagens do blog destaca simultaneamente dplyr funcionalidade também!

Hoje, quero mostrar alguns recursos auxiliares de seleção de coluna do tidyselect pacote – geralmente usado em conjunto com dplyr – que terminei agora replicado dentro poorman, claro, usando base só. Também discutirei um pouco sobre o que está acontecendo no fundo de poormanO desenvolvimento de testes.

A primeira versão oficial do poorman (v 0.1.9) foi a primeira versão que considerei conter toda a funcionalidade “principal” do dplyr; tudo de select() para group_by() e summarise(). Agora que essa funcionalidade está detalhada, me dá tempo para focar em alguns dos recursos menores do dplyr e quanto maior tidyverse e assim, ao longo das últimas semanas, venho trabalhando para adicionar o tidyselect::select_helpers para poorman. Para aqueles que desconhecem, select_helpers são uma coleção de funções que ajudam o usuário a selecionar variáveis ​​com base em seus nomes. Por exemplo, você pode selecionar todas as colunas que começam com um determinado prefixo ou talvez selecionar colunas que correspondam a uma expressão regular específica. Vamos dar uma olhada em alguns exemplos.

Selecionando colunas com base em nomes de colunas parciais

Se seus dados contiverem muitas colunas cujos nomes compartilham uma estrutura semelhante, você poderá usar a correspondência parcial adicionando starts_with(), ends_with() ou contains() na tua select()/relocate() declaração.

library(poorman, warn.conflicts = FALSE)
iris %>% select(starts_with("Petal"), ends_with("Width")) %>% head()
#   Petal.Length Petal.Width Sepal.Width
# 1          1.4         0.2         3.5
# 2          1.4         0.2         3.0
# 3          1.3         0.2         3.2
# 4          1.5         0.2         3.1
# 5          1.4         0.2         3.6
# 6          1.7         0.4         3.9

Reordenar colunas

As colunas do iris O conjunto de dados vem na seguinte ordem.

colnames(iris)
# [1] "Sepal.Length" "Sepal.Width"  "Petal.Length" "Petal.Width"  "Species"

Mas e se quiséssemos todas as colunas “Largura” no início deste data.frame? Existem algumas maneiras pelas quais podemos conseguir isso. Em primeiro lugar, podemos usar select() em combinação com o ajudante selecionado everything().

iris %>% select("Petal.Width", "Sepal.Width", everything()) %>% head()
#   Petal.Width Sepal.Width Sepal.Length Petal.Length Species
# 1         0.2         3.5          5.1          1.4  setosa
# 2         0.2         3.0          4.9          1.4  setosa
# 3         0.2         3.2          4.7          1.3  setosa
# 4         0.2         3.1          4.6          1.5  setosa
# 5         0.2         3.6          5.0          1.4  setosa
# 6         0.4         3.9          5.4          1.7  setosa

poorman aqui primeiro selecione as colunas “Petal.Width” e “Sepal.Width” antes de selecionar todo o resto. Isso é ótimo, mas se seus dados contiverem muitas colunas contendo “Largura”, você terá que escrever muitos nomes de colunas. Bem, é aqui que podemos usar relocate() e o ajudante de seleção contains() para mover essas colunas para o início de iris.

iris %>% relocate(contains("Width")) %>% head()
#   Sepal.Width Petal.Width Sepal.Length Petal.Length Species
# 1         3.5         0.2          5.1          1.4  setosa
# 2         3.0         0.2          4.9          1.4  setosa
# 3         3.2         0.2          4.7          1.3  setosa
# 4         3.1         0.2          4.6          1.5  setosa
# 5         3.6         0.2          5.0          1.4  setosa
# 6         3.9         0.4          5.4          1.7  setosa

Por padrão, relocate() moverá todas as colunas selecionadas para o início do data.frame. Você pode ajustar esse comportamento com o .before e .after parâmetros. Vamos mover as colunas “Pétala” para que apareçam depois da coluna “Espécies”.

iris %>% relocate(contains("Petal"), .after = Species) %>% head()
#   Sepal.Length Sepal.Width Species Petal.Length Petal.Width
# 1          5.1         3.5  setosa          1.4         0.2
# 2          4.9         3.0  setosa          1.4         0.2
# 3          4.7         3.2  setosa          1.3         0.2
# 4          4.6         3.1  setosa          1.5         0.2
# 5          5.0         3.6  setosa          1.4         0.2
# 6          5.4         3.9  setosa          1.7         0.4

Selecionar colunas usando uma expressão regular

As funções auxiliares anteriores funcionam com correspondências exatas de padrão. Digamos que você tenha padrões semelhantes nos nomes das colunas que não sejam exatamente iguais. Você pode usar expressões regulares com o matches() função auxiliar para identificá-los. Aqui vou usar o mtcars conjunto de dados e procure extrair todas as colunas que começam com “w” ou “d” e terminam com “t”.

Leia Também  Novo pacote - {cdccovidview} - Para trabalhar com os novos rastreadores COVID-19 do CDC dos EUA: COVIDView e COVID-NET
cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
mtcars %>% select(matches("^[wd].*[t]$")) %>% head()
#                   drat    wt
# Mazda RX4         3.90 2.620
# Mazda RX4 Wag     3.90 2.875
# Datsun 710        3.85 2.320
# Hornet 4 Drive    3.08 3.215
# Hornet Sportabout 3.15 3.440
# Valiant           2.76 3.460

A Lista Auxiliar de Seleção

Vimos alguns exemplos de ajudantes selecionados agora disponíveis em poorman. Existem mais, no entanto, e a lista a seguir detalha cada um deles. Lembre-se de que essas funções podem ser usadas para ajudar os usuários select() e relocate() colunas dentro data.frames.

  • starts_with(): Inicia com um prefixo.
  • ends_with(): Termina com um sufixo.
  • contains(): Contém uma cadeia literal.
  • matches(): Corresponde a uma expressão regular.
  • num_range(): Corresponde a um intervalo numérico como x01, x02, x03.
  • all_of(): Corresponde a nomes de variáveis ​​em um vetor de caracteres. Todos os nomes devem estar presentes, caso contrário, um erro fora dos limites será gerado.
  • any_of(): Igual a all_of(), exceto que nenhum erro é gerado para nomes que não existem.
  • everything(): Corresponde a todas as variáveis.
  • last_col(): Selecione a última variável, possivelmente com um deslocamento.

Houve uma solicitação no Twitter para montar uma imagem do Docker para poorman. Isso já foi feito e pode ser visto no Dockerhub. Isso significa que, se você tiver o Docker instalado, poderá executar uma versão em contêiner do poorman facilmente com a seguinte linha de código.

docker run --rm -it nathaneastwood/poorman

Desde o último lançamento de poorman (v 0.1.9) para CRAN, tenho trabalhado em alguns bugs que eu e outros usuários do pacote identificamos. Fico feliz em dizer que agora eles foram esmagados e a lista de problemas está muito vazia. Como uma breve visão geral, os seguintes problemas foram corrigidos:

  • mutate() criações de coluna estão imediatamente disponíveis, p. mtcars %>% mutate(mpg2 = mpg * 2, mpg4 = mpg2 * 2) criará colunas nomeadas mpg2 e mpg4
  • group_by() grupos agora persistem em seleções, por exemplo mtcars %>% group_by(am) %>% select(mpg) retornará am e mpg colunas
  • slice() agora duplica linhas, por exemplo mtcars %>% slice(2, 2, 2) retornará a linha 2 três vezes
  • summarize() agora é exportado
Leia Também  Novo trabalho em serviços financeiros

dplyr é um pacote muito conhecido e extremamente bem desenvolvido. Para poorman para ter credibilidade, ele precisa funcionar corretamente. Portanto, uma grande quantidade de esforço e energia foi testada poorman para garantir que produz os resultados esperados. Desde a adição de todos os novos recursos e correções de erros descritos neste blog, poorman superou 100 testes!

tinytest::test_all()                                    
# Running test_arrange.R................    5 tests OK
# Running test_filter.R.................    6 tests OK
# Running test_groups.R.................    5 tests OK
# Running test_joins_filter.R...........    4 tests OK
# Running test_joins.R..................    7 tests OK
# Running test_mutate.R.................    6 tests OK
# Running test_pull.R...................    6 tests OK
# Running test_relocate.R...............    6 tests OK
# Running test_rename.R.................    4 tests OK
# Running test_rownames.R...............    2 tests OK
# Running test_select_helpers.R.........   25 tests OK
# Running test_select.R.................   13 tests OK
# Running test_slice.R..................    5 tests OK
# Running test_summarise.R..............    6 tests OK
# Running test_transmute.R..............    3 tests OK
# Running test_utils.R..................    1 tests OK
# [1] "All ok, 104 results"

Isso também significa que a cobertura do pacote é extremamente alta.

covr::package_coverage()                                                                                        #
# poorman Coverage: 97.87%
# R/utils.R: 80.00%
# R/group.R: 90.91%
# R/joins.R: 92.86%
# R/arrange.R: 100.00%
# R/filter.R: 100.00%
# R/init.R: 100.00%
# R/joins_filtering.R: 100.00%
# R/mutate.R: 100.00%
# R/pipe.R: 100.00%
# R/pull.R: 100.00%
# R/relocate.R: 100.00%
# R/rename.R: 100.00%
# R/rownames.R: 100.00%
# R/select_helpers.R: 100.00%
# R/select.R: 100.00%
# R/slice.R: 100.00%
# R/summarise.R: 100.00%
# R/transmute.R: 100.00%

Espero que isso dê aos usuários de poorman essa confiança extra ao usar o pacote. Enviei agora esta versão atualizada do poorman para CRAN e estou apenas esperando o feedback deles, espero que nos próximos dias ele esteja disponível. Assista esse espaço!



Se você chegou até aqui, por que não inscreva-se para atualizações do site? Escolha seu sabor: e-mail, Twitter, RSS ou facebook …



cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br