Если мы сделаем left_join
между первым и поисковым набором данных на основе «пол», «возраст», мы получим два столбца «длина», проведем сравнение между этими столбцами и создадим новый столбец с ifelse
или case_when
library(dplyr)
left_join(df1, lookup, by = c('sex', 'age')) %>%
transmute(id, sex, age,
growth.rate = case_when(length.x <= length.y ~ "Low",
TRUE ~ "Normal"), length = length.x)
# id sex age growth.rate length
#1 1 Female 1 Low 45
#2 2 Female 2 Normal 54
#3 3 Female 3 Low 56
#4 4 Female 4 Normal 60
#5 5 Female 5 Low 60
#6 6 Female 6 Low 61
#7 7 Female 7 Low 63
#8 8 Male 1 Normal 55
#9 9 Male 2 Low 54
#10 10 Male 3 Normal 58
#11 11 Male 4 Normal 61
#12 12 Male 5 Normal 65
#13 13 Male 6 Low 63
#14 14 Male 7 Low 65
#15 15 Male 8 Normal 67
#16 16 Male 9 Normal 68
#17 17 Male 10 Low 69
В data.table
это можно сделать более компактным
library(data.table)
setDT(df1)[lookup, growth.rate := fcase(length <= i.length, "Low",
"Normal"), on = .(sex, age)]
Или с индексом
setDT(df1)[lookup, growth.rate :=
c("Normal", "Low")[1 + (length <= i.length)], on = .(sex, age)]
data
df1 <- structure(list(id = 1:17, sex = c("Female", "Female", "Female",
"Female", "Female", "Female", "Female", "Male", "Male", "Male",
"Male", "Male", "Male", "Male", "Male", "Male", "Male"), age = c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L
), length = c(45L, 54L, 56L, 60L, 60L, 61L, 63L, 55L, 54L, 58L,
61L, 65L, 63L, 65L, 67L, 68L, 69L)), class = "data.frame", row.names = c(NA,
-17L))
lookup <- structure(list(sex = c("Female", "Female", "Female", "Female",
"Female", "Female", "Female", "Male", "Male", "Male", "Male",
"Male", "Male", "Male", "Male", "Male", "Male"), age = c(1L,
2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L
), length = c(50L, 53L, 56L, 58L, 60L, 61L, 63L, 50L, 54L, 57L,
60L, 62L, 63L, 65L, 66L, 67L, 69L)), class = "data.frame", row.names = c(NA,
-17L))