Here is an approach with dplyr
and tidyr
:
library(tidyverse)
data %>%
separate(1, sep = ",", into = c("country","year","var1","var2")) %>%
mutate(across(year:var2, as.numeric)) %>%
group_by(country) %>%
mutate(var2 = var2 * ((2*min(var1))-var1)/100)
## A tibble: 6 x 4
## Groups: country [2]
# country year var1 var2
# <chr> <dbl> <dbl> <dbl>
#1 country1 2020 100 1
#2 country1 2025 120 0.8
#3 country1 2030 140 0.6
#4 country2 2020 100 1
#5 country2 2025 150 0.5
#6 country2 2030 180 0.2
Or with data.table
:
library(data.table)
setDT(data)
data[, c("country","year","var1","var2") := tstrsplit(V1,",")]
data[,V1 := NULL]
data[,c("year","var1","var2") := lapply(.SD,as.numeric),.SDcol = c("year","var1","var2")]
data[,var2 := .(var2 * (2*min(var1)-var1)/100), by = "country"]
data
# country year var1 var2
#1: country1 2020 100 1.0
#2: country1 2025 120 0.8
#3: country1 2030 140 0.6
#4: country2 2020 100 1.0
#5: country2 2025 150 0.5
#6: country2 2030 180 0.2
data <- structure(list(V1 = c("country1,2020,100,1", "country1,2025,120,1",
"country1,2030,140,1", "country2,2020,100,1", "country2,2025,150,1",
"country2,2030,180,1")), class = "data.frame", row.names = c(NA,
-6L))