Мне не совсем понятно, что вы хотите сделать, но, учитывая ваш код и вопрос о том, как выполнить слияние, следующее может помочь вам в работе.
# test data frame
df <- tibble::tribble(
~People, ~score, ~item,
"Mary", 1, "a",
"Mary", 2, "a",
"Jack", 1.5, "b",
"Jack", 3, "a",
"Jack", 4.1, "b",
"Kate", 0.8, "a"
)
# counting occurrence
> df %>%
group_by(item) %>%
mutate(nb = n())
# A tibble: 6 x 4
# Groups: item [2]
People score item nb
<chr> <dbl> <chr> <int>
1 Mary 1 a 4
2 Mary 2 a 4
3 Jack 1.5 b 2
4 Jack 3 a 4
5 Jack 4.1 b 2
6 Kate 0.8 a 4
Обратите внимание, что это приводит к "сгруппированному" кадру данных. Вы можете ungroup()
.
Вы также можете использовать встроенный count()
:
item_count <- df %>% count(item)
item_count
# A tibble: 2 x 2
item n
<chr> <int>
1 a 4
2 b 2
Используя {tidyverse}
, вы объединяете кадры данных с xxx_joint()
. Здесь мы используем left_join()
:
df <- df %>% left_join(item_count, by = "item")
df
# A tibble: 6 x 4
People score item n
<chr> <dbl> <chr> <int>
1 Mary 1 a 4
2 Mary 2 a 4
3 Jack 1.5 b 2
4 Jack 3 a 4
5 Jack 4.1 b 2
6 Kate 0.8 a 4
Теперь вы можете применить фильтрацию на основе группировки people
.
df %>% group_by(People) %>% summarise(reviews = n(), mean_score = mean(score))
# A tibble: 3 x 3
People reviews mean_score
<chr> <int> <dbl>
1 Jack 3 2.87
2 Kate 1 0.8
3 Mary 2 1.5
df %>% group_by(People) %>% summarise(reviews = n(), mean_score = mean(score)) %>% filter(reviews >= 2)
# A tibble: 2 x 3
People reviews mean_score
<chr> <int> <dbl>
1 Jack 3 2.87
2 Mary 2 1.5
Примечание: обычно вы используете summarise()
для агрегирования строки по отдельным группам.
Сравните это с исходным использованием group_by()
и mutate()
.
Спасибо вам большое за ваш ответ! Это так ясно и понятно