divide values in a single column by group

Viewed 34

I have the following data frame:

group <- c("per1", "per1", "per1", "per2", "per2", "per2")
geo <- c("trct1", "trct2", "trct3", "trct1", "trct2", "trct3")
value <- c(1, 3, 4, 5, 6, 7)
df <- data.frame(group, geo, value)

I am trying to calculate the percentage change in value between per1 and per2 by each census tract. So far, I have tried

df <- df %>%
  group_by(geo) %>%
  mutate(perc_change = (value[per2] - value[per1])/value[per1])

But I keep getting the following error: Error: Problem with mutate() column perc_change. ℹ perc_change = (value[per2] - value[per1])/value[per1]. x object 'per2' not found ℹ The error occurred in group 1: geo = "trct1".

I want the final data to look like

per1     "trct1"   1
per1     "trct2"   3
per1     "trct3"   4
per2     "trct1"   5
per2     "trct2"   6
per2     "trct3"   7
change   "trct1"   % change
change   "trct2"   % change
change   "trct3"   % change

1 Answers

You should do:

df <- df %>%
  group_by(geo) %>%
  mutate(perc_change = (value[group == 'per2'] - value[group == 'per1'])/value[group == 'per1'])

Which gives:

# A tibble: 6 x 4
# Groups:   geo [3]
  group geo   value perc_change
  <chr> <chr> <dbl>       <dbl>
1 per1  trct1     1        4   
2 per1  trct2     3        1   
3 per1  trct3     4        0.75
4 per2  trct1     5        4   
5 per2  trct2     6        1   
6 per2  trct3     7        0.75

Since this repeats the results for each group, I suggest doing a summarize instead of mutate.

Related