I have this very simple dataframe in R:
<code>df = data.frame(
class=c("a", "a", "b")
)
</code>
<code>df = data.frame(
class=c("a", "a", "b")
)
</code>
df = data.frame(
class=c("a", "a", "b")
)
Now I want to check if a group has a size larger than one and based on that information create a new column called e.g. class_2
like this:
<code>df %>%
group_by(class) %>%
mutate(class_2 = if_else(n() > 1, glue("{class}_{row_number()}"), class))
</code>
<code>df %>%
group_by(class) %>%
mutate(class_2 = if_else(n() > 1, glue("{class}_{row_number()}"), class))
</code>
df %>%
group_by(class) %>%
mutate(class_2 = if_else(n() > 1, glue("{class}_{row_number()}"), class))
However, I get the error:
<code>Error in `mutate()`:
ℹ In argument: `class_2 = if_else(n() > 1, glue("{class}_{row_number()}"), class)`.
ℹ In group 1: `class = "a"`.
Caused by error in `if_else()`:
! `true` must have size 1, not size 2.
Run `rlang::last_trace()` to see where the error occurred.
</code>
<code>Error in `mutate()`:
ℹ In argument: `class_2 = if_else(n() > 1, glue("{class}_{row_number()}"), class)`.
ℹ In group 1: `class = "a"`.
Caused by error in `if_else()`:
! `true` must have size 1, not size 2.
Run `rlang::last_trace()` to see where the error occurred.
</code>
Error in `mutate()`:
ℹ In argument: `class_2 = if_else(n() > 1, glue("{class}_{row_number()}"), class)`.
ℹ In group 1: `class = "a"`.
Caused by error in `if_else()`:
! `true` must have size 1, not size 2.
Run `rlang::last_trace()` to see where the error occurred.
I understand the errormessage itself. I am just not really understanding why that is. Is it because glue
is using all the values from the currently grouped data?
Also what would be an easy fix? I could create a new column ungroup the data and compute the column like this:
<code>df %>%
group_by(class) %>%
mutate(n = n()) %>%
ungroup() %>%
mutate(class_2 = if_else(n > 1, glue("{class}_{row_number()}"), class))
</code>
<code>df %>%
group_by(class) %>%
mutate(n = n()) %>%
ungroup() %>%
mutate(class_2 = if_else(n > 1, glue("{class}_{row_number()}"), class))
</code>
df %>%
group_by(class) %>%
mutate(n = n()) %>%
ungroup() %>%
mutate(class_2 = if_else(n > 1, glue("{class}_{row_number()}"), class))
But is this really the best option?