#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"))