I want to calculate the current value – lag(value) by their IDs.
My question is how to loop over this procedure by its column names?
I want to creat new column names for each calculated value.
data <- data_frame(
id = sample(letters[1:15], size = 60, replace = TRUE),
age = round(runif(60, min = 48, max = 90)),
a = runif(60),
b = rnorm(60),
c = rnorm(60),
d = rnorm(60),
e = rnorm(60),
f = rnorm(60),
g = rnorm(60),
h = rnorm(60),
i = rnorm(60),
j = rnorm(60),
k = rnorm(60),
l = rnorm(60))
I want to loop this process from column name "a" to "l" with new column names.
data <-
data %>%
group_by(id) %>%
arrange(age) %>%
mutate(a_change = a - lag(a, default = first(a)))
By desired outcome is to have
a_change, b_change, … l_change.
Thanks!
>Solution :
Use across‘s names argument to specify the name of new column dynamically ({col} refers to the name of the column) and it will create the desired column names.
library(dplyr)
data %>%
group_by(id) %>%
mutate(across(a:l, ~ .x - lag(.x, default = first(.x)),
.names = "{col}_change"))