Мы можем использовать
library(dplyr)
data %>%
group_by(age, lab) %>%
do(data.frame(., newval = ecdf(.$value)(.$value)))
Или с mutate
data %>%
group_by(age, lab) %>%
mutate(newval = ecdf(value)(value))
# A tibble: 9 x 4
# Groups: age, lab [6]
# age lab value newval
# <int> <chr> <dbl> <dbl>
#1 20 wbc 7 1
#2 20 wbc 6.5 0.5
#3 20 rbc 3.5 1
#4 30 rbc 4 1
#5 30 plt 100 0.5
#6 30 plt 120 1
#7 40 wbc 5 0.5
#8 40 wbc 7.5 1
#9 40 rbc 4.1 1
Обновить
Если мы хотим сохранить функцию в виде столбца,затем оберните его в list
data %>%
group_by(age, lab) %>%
mutate(ecdfFun = list(ecdf(value)))
Это также может быть summarise
d
data %>%
group_by(age, lab) %>%
summarise(ecdfFun = list(ecdf(value)))
data
data <- structure(list(age = c(20L, 20L, 20L, 30L, 30L, 30L, 40L, 40L,
40L), lab = c("wbc", "wbc", "rbc", "rbc", "plt", "plt", "wbc",
"wbc", "rbc"), value = c(7, 6.5, 3.5, 4, 100, 120, 5, 7.5, 4.1
)), class = "data.frame", row.names = c(NA, -9L))