В базе R мы можем разделить values
на '_'
, объединить их как матрицу и разделить по столбцам.
response <- setNames(asplit(do.call(rbind, strsplit(values, "_")), 2), keys)
#Similarly
#response <- setNames(asplit(do.call(cbind, strsplit(values, "_")), 1), keys)
response
#$key1
#[1] "val1" "wert1" "n1" "out1"
#$key2
#[1] "val2" "wert2" "n2" "out2"
#$key3
#[1] "val3" "wert3" "n3" "out3"
Это коротко и почти дает аналогичный результат
purrr::transpose(strsplit(values, "_"), .names = keys)