emoji_turnover() compares the set of distinct emoji used in each period
with the set used in the one before: how much of the vocabulary is shared,
how much is new, how much was dropped.
Usage
emoji_turnover(
data,
text,
time,
by = "month",
measure = c("jaccard", "new", "lost", "core")
)Arguments
- data
A data frame or tibble containing a text column. Grouped data frames are accepted. The verbs that work a row at a time (adding columns, or keeping and expanding rows) carry the grouping through to their result, as
dplyr::mutate()anddplyr::filter()do. The verbs that pool across rows – the counts, the co-occurrence edge lists, the time series – warn that they ignore the grouping and return one corpus-wide answer.- text
The text column to scan, supplied unquoted. Any atomic column is accepted and read as character, so a
factorworks and a numeric,Dateor logical one simply contains no emoji. A list column – or a data-frame column – is refused rather than coerced, because coercing one deparses it and the emoji found would be in the code rather than in your data. What counts as an emoji is the same in every verb; see the Detection section of tidyEmoji for the one case that surprises people, code points that are emoji only when they carryU+FE0F.- time
Unquoted column of dates or date-times (
Date,POSIXct, or character in"YYYY-MM-DD"form). A date-time is bucketed by the calendar day it displays as in its own timezone, not by its UTC day: an emoji posted at 23:30 New York time belongs to that day, not to the next one."Its own timezone" means the column's
tzoneattribute. APOSIXctcreated without one – which is whatas.POSIXct("2024-01-01 23:30")and most CSV readers give you – has no timezone of its own, so R displays it in the session's, and the buckets follow. The same column then gives hour 23 on one machine and hour 4 on another. Tag the column (as.POSIXct(x, tz = "UTC"), orlubridate::force_tz()) if the result has to be reproducible; aDatecolumn is immune either way.A character column must lead with a four-digit year:
"2024-01-01"or"2024/01/01", with one- or two-digit month and day, and any trailing time ignored. Values that do not parse warn and are dropped – but a column in which nothing reads as a date is an error rather than a column ofNA, since there would be no time axis left. Note that"01/02/2024"is in the second group: convert a column written that way withas.Date()and its ownformatfirst.- by
Period length:
"day","week"(starting Monday),"month"(default),"quarter"or"year".- measure
Which statistics to return: any of
"jaccard","new","lost"and"core". All four by default. Abbreviations work ("jac"), duplicates are ignored, and the columns come back in the order above whatever order you ask in. A value that matches none of the four is an error rather than being dropped.
Value
A tibble with one row per consecutive pair of periods: .period,
.period_prev, n_types_prev, n_types, and then the requested
jaccard, n_new, n_lost and n_core columns. Fewer than two periods
yields no rows.
Details
A period's vocabulary is its set of distinct canonicalised glyphs, so an
emoji used a thousand times and one used once count the same – turnover is
about repertoire, not volume. jaccard is the size of the intersection over
the size of the union, and is NA when both periods are empty.
Rows whose time is missing or unparseable contribute nothing, as in
emoji_trend(), so a period appears here only if at least one dated row
falls in it.
Examples
df <- data.frame(
when = as.Date(c("2024-01-05", "2024-02-03", "2024-02-20")),
text = c("\U0001f600\U0001f602", "\U0001f600", "\U0001f389")
)
emoji_turnover(df, text, when)
#> # A tibble: 1 × 8
#> .period .period_prev n_types_prev n_types jaccard n_new n_lost n_core
#> <date> <date> <int> <int> <dbl> <int> <int> <int>
#> 1 2024-02-01 2024-01-01 2 2 0.333 1 1 1