I feel like this has been asked before but I can't find a repex that describes what I'm trying to do.
Suppose I have this dataframe:
df <- data.frame(ID = c(1, 1, 1, 2, 2, 2, 3, 3, 3),
                 B = c(34, 54, 17, 2, 25, 89, 23, 93, 90),
                 C = c(1, 2, 3, 1, 2, 3, 1, 2, 3))
> df
  ID  B C
1  1 34 1
2  1 54 2
3  1 17 3
4  2  2 1
5  2 25 2
6  2 89 3
7  3 23 1
8  3 93 2
9  3 90 3
I would like to create/mutate columns D and E that lists the value of column B matching the minimum and maximum of column C. So the output would be:
> df
  ID  B C  D  E
1  1 34 1 34 17
2  1 54 2 34 17
3  1 17 3 34 17
4  2  2 1  2 89
5  2 25 2  2 89
6  2 89 3  2 89
7  3 23 1 23 90
8  3 93 2 23 90
9  3 90 3 23 90
ID is a grouping variable; however, I would want an ungrouped output.
We can group by 'ID', create the D by subsetting the 'B' based on the min (or first element of C if it is already ordered) and similarly the 'E' by the max index of 'C' (or last element of 'C')
library(dplyr)
df %>%
   group_by(ID) %>%
   mutate(D = B[min(C)], E = B[max(C)]) %>%
   ungroup
-output
# A tibble: 9 x 5
#    ID     B     C     D     E
#  <dbl> <dbl> <dbl> <dbl> <dbl>
#1     1    34     1    34    17
#2     1    54     2    34    17
#3     1    17     3    34    17
#4     2     2     1     2    89
#5     2    25     2     2    89
#6     2    89     3     2    89
#7     3    23     1    23    90
#8     3    93     2    23    90
#9     3    90     3    23    90
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With