Вы можете просто сопоставить свои ключи с вашими данными:
library(tidyverse)
mutate_at(dat, vars(ttotal:t09), funs(map_dbl(., ~ keys$mid[keys$class == .x])))
Какие выходные данные:
name type place ttotal t01 t02 t03 t04 t05 t06 t07 t08 t09
1 joe cat SE 45.0 7.5 3 3 7.5 3.0 25.0 3.0 0.0 0.5
2 john cat SE 3.0 0.0 0 15 0.0 7.5 0.5 7.5 0.5 45.0
3 sue cat SE 0.5 3.0 0 25 0.0 15.0 0.5 15.0 7.5 0.0
4 jack cat SE 35.0 7.5 15 3 3.0 15.0 0.0 3.0 0.5 25.0
Объяснение:
С помощью dplyr::mutate_at()
вы можете изменять значения переменных, которые вы выбираете с помощью vars(ttotal:t09)
, применяя функцию funs(...)
к каждой из выбранных переменных.Для каждой переменной map_dbl(., ~ keys$mid[keys$class == .x])
сравнивает ее с keys$class
поэлементно (key$class == .x
) и подмножествами keys$mid
, получая логический вектор.
Ваши данные:
dat <-
structure(
list(
name = c("joe", "john", "sue", "jack"),
type = c("cat",
"cat", "cat", "cat"),
place = c("SE", "SE", "SE", "SE"),
ttotal = c(7L,
2L, 1L, 6L),
t01 = c(3L, 0L, 2L, 3L),
t02 = c(2L, 0L, 0L, 4L),
t03 = c(2L, 4L, 5L, 2L),
t04 = c(3L, 0L, 0L, 2L),
t05 = c(2L,
3L, 4L, 4L),
t06 = c(5L, 1L, 1L, 0L),
t07 = c(2L, 3L, 4L,
2L),
t08 = c(0L, 1L, 3L, 1L),
t09 = c(1L, 7L, 0L, 5L)
),
class = "data.frame",
row.names = c(NA,-4L)
)
keys <-
structure(
list(
lo = c(0L, 0L, 1L, 5L, 10L, 20L, 30L, 40L),
hi = c(0L,
1L, 2L, 10L, 20L, 30L, 40L, 50L),
class = 0:7,
mid = c(0, 0.5,
3, 7.5, 15, 25, 35, 45)
),
class = "data.frame",
row.names = c(NA,-8L)
)