Contar unicamente e somar

Boa tarde pessoal, tudo bem?

Estou com uma base e preciso fazer uma nova coluna a partir de uma linha, mas não pode somar olhem:

Num_proposta Num_parcelas_pagas
3323 1
3323 2
3323 3
3323 4
2224 1
2224 2
2224 3
2224 4
5421 1
5421 2
5421 3
5421 4

Notamos que cada cliente pagou quatro parcelas eu quero criar uma nova coluna, mas apenas contando o número de parcelas e não somando as linhas. Quero que fique assim:

Num_proposta Num_parcelas_pagas
3323 4
2224 4
5421 4

Cada cliente pagou 4 parcelas.

Na verdade a tabela vai ficar assim:

Num_proposta Num_parcelas_pagas
3323 4
3323 NULL
3323 NULL
3323 NULL
2224 4
2224 NULL
2224 NULL
2224 NULL
5421 4
5421 NULL
5421 NULL
5421 NULL

Se ficar assim não tem problema

Obrigado!!!

Você sabe usar o pacote dplyr? Se não, dê uma olhada no nosso livro (7.2 O pacote dplyr | Ciência de Dados em R) porque ele é muito útil nessas situações.

Neste caso, basta fazer um group_by() seguido de um summarise(). A função que você quer para calcular o número de linhas em um grupo é a n().

library(dplyr)

# Base para exemplo
base <- data.frame(
  Num_proposta = c(3323, 3323, 3323, 3323, 2224, 2224, 2224, 2224, 5421, 5421, 5421, 5421),
  Num_parcelas_pagas = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4)
)

base %>%
  group_by(Num_proposta) %>%
  summarise(Num_parcelas_pagas = n())
#> # A tibble: 3 × 2
#>   Num_proposta Num_parcelas_pagas
#>          <dbl>              <int>
#> 1         2224                  4
#> 2         3323                  4
#> 3         5421                  4

Created on 2022-07-27 by the reprex package (v2.0.1)

Pô valeu clente, mas como eu acrescento essa coluna no data.frame? o mutate resolve?

Não sei se entendi a sua pergunta. O summarise() já cria a coluna resumida, então bastaria atribuir o resultado a um novo objeto; se você quer de fato criar uma coluna com buracos, veja o código que cria a base_limpa.

library(dplyr)

# Base para exemplo
base <- data.frame(
  Num_proposta = c(3323, 3323, 3323, 3323, 2224, 2224, 2224, 2224, 5421, 5421, 5421, 5421),
  Num_parcelas_pagas = c(1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4)
)

base_resumida <- base %>%
  group_by(Num_proposta) %>%
  summarise(Num_parcelas_pagas = n())

# Nova base
base_resumida
#> # A tibble: 3 × 2
#>   Num_proposta Num_parcelas_pagas
#>          <dbl>              <int>
#> 1         2224                  4
#> 2         3323                  4
#> 3         5421                  4

base_limpa <- base %>%
  group_by(Num_proposta) %>%
  mutate(Num_parcelas_pagas = ifelse(Num_parcelas_pagas == max(Num_parcelas_pagas), Num_parcelas_pagas, NA)) %>%
  ungroup()

# Versão com NA
base_limpa
#> # A tibble: 12 × 2
#>    Num_proposta Num_parcelas_pagas
#>           <dbl>              <dbl>
#>  1         3323                 NA
#>  2         3323                 NA
#>  3         3323                 NA
#>  4         3323                  4
#>  5         2224                 NA
#>  6         2224                 NA
#>  7         2224                 NA
#>  8         2224                  4
#>  9         5421                 NA
#> 10         5421                 NA
#> 11         5421                 NA
#> 12         5421                  4

Created on 2022-07-28 by the reprex package (v2.0.1)

Obrigado mais uma vez.
Acho que isso resolve porque eu terei que colocar essa nova coluna em um dataFrame com mais 40 colunas e por isso, acho que deixando com os buracos o join funciona melhor certo?

Depende muito do seu caso de uso. Acho que, idealmente, estamos falando de duas tabelas diferentes: uma na qual a chave é a parcela e outra na qual é a proposta. Se você está analisando os dados, talvez seja melhor trabalhar com os dados completos em um lugar e com os dados agregados em outro. Note que os buracos podem, por exemplo, atrapalhar um possível filtro da base completa.

1 curtida