Использование dplyr для создания нового столбца и подсчета дубликатов с пороговым значением

#r #dataframe #dplyr

#r #фрейм данных #dplyr

Вопрос:

Привет, у меня есть df, такой как

   color  type Nb 
1 black chair 3
2 black chair 3 
3 black chair 3
4 green sofa2 1
5 green sofa3 1
6  blue plate 2
7  blue plate 2
8  blue sofa  2
8  blue sofa  2
  

Я хотел бы подсчитать внутри каждого color количество дубликатов type и добавить его в a Newcolumn , но только если nb>1

тогда я должен получить :

   color  type Nb Newcolumn
1 black chair 3  1
2 black chair 3  1
3 black chair 3  1
4 green sofa2 1  0
5 green sofa3 1  0
6 blue  plate 2  2
7 blue  plate 2  2
8 blue  sofa  2  2
9 blue  sofa  2  2
  

например, внутри группы black слово chair дублируется, и nb >1
поэтому я добавляю 1 .

в группе green нет дублированного слова, поэтому я добавляю 0 .

в группе red есть 2 дублированных слова plate и sofa, и их Nb > 1 затем я добавляю 2 в Newcolumn .

У кого-нибудь есть идея?

Я знаю только, как подсчитать количество дублированных слов в каждой группе, используя :

 tab %>%
  group_by(color) %>%
  mutate(Newcolumn = n_distinct(type))
  

Комментарии:

1. для комбинации «черный» и «стул» значение nb равно 3, поэтому в вашем примере данных больше 1?

2. вы правы, я отредактировал

Ответ №1:

dplyr::n_distinct() должен сделать свое дело:

 library(dplyr)

df <- dplyr::tibble(color = c("black", "black", "black", "green", "green", "blue", "blue", "blue", "blue"),
                type =c("chair", "chair", "chair", "sofa2", "sofa3", "plate", "plate", "sofa", "sofa"),
                Nb = c(3,3,3,1,1,2,2,2,2))


# calculations
df %>%
  dplyr::group_by(color) %>% 
  dplyr::mutate(distinct = dplyr::n_distinct(type)) %>% 
  dplyr::mutate(Newcolumn = ifelse(Nb > 1, distinct , 0))

   color type     Nb distinct Newcolumn
  <chr> <chr> <dbl>  <int>     <dbl>
1 black chair     3      1         1
2 black chair     3      1         1
3 black chair     3      1         1
4 green sofa2     1      2         0
5 green sofa3     1      2         0
6 blue  plate     2      2         2
7 blue  plate     2      2         2
8 blue  sofa      2      2         2
9 blue  sofa      2      2         2
  

Ответ №2:

Мы можем использовать data.table методы

 library(data.table)
setDT(df)[, Newcolumn := 0][Nb > 1, Newcolumn := uniqueN(type), color]
  

-вывод

 df
#   color  type Nb Newcolumn
#1: black chair  3         1
#2: black chair  3         1
#3: black chair  3         1
#4: green sofa2  1         0
#5: green sofa3  1         0
#6:  blue plate  2         2
#7:  blue plate  2         2
#8:  blue  sofa  2         2
#9:  blue  sofa  2         2
  

данные

 df <- structure(list(color = c("black", "black", "black", "green", 
"green", "blue", "blue", "blue", "blue"), type = c("chair", "chair", 
"chair", "sofa2", "sofa3", "plate", "plate", "sofa", "sofa"), 
    Nb = c(3L, 3L, 3L, 1L, 1L, 2L, 2L, 2L, 2L)), class = "data.frame",
    row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9"))