Условный поиск значений в другом фрейме данных для заполнения столбца в R

#r #dataframe #reference #lookup

Вопрос:

У меня есть один df1 фрейм данных со столбцами age И. testScore Мне нужен третий normScore , основанный на age , testScore и ссылки на второй df2 фрейм данных . Позвольте мне показать вам:

df1

возраст Зачетные баллы normScore
78.6 1
87.1 2

df2

Возраст Возраст Зачетные баллы normScore
70 79.9 1 15
70 79.9 2 20
80 89.9 1 18
80 89.9 2 24

Так что мне нужно сравнить age in df1 с ageStart и ageEnd in df2 , а затем использовать testScore in df1 , чтобы выбрать normScore in df2 и сохранить normScore в normScore столбце in df1 , как показано ниже:

df1

возраст Зачетные баллы normScore
78.6 1 15
87.1 2 24

В Excel я бы использовал SUMPRODUCT, но я немного новичок в R. Вы можете мне помочь? (Я снова публикую, потому что я перепутал таблицы в предыдущем посте, извините за это)

Ответ №1:

Адаптация этого ответа это может быть достигнуто с помощью fuzzyjoin пакета, например:

 library(fuzzyjoin)
library(dplyr)

df1 <- data.frame(
  age = c(78.6, 87.1),
  testScore = c(1L, 2L)
)

df2 <- data.frame(
  ageStart = c(70L, 70L, 80L, 80L),
  ageEnd = c(79.9, 79.9, 89.9, 89.9),
  testScore = c(1L, 2L, 1L, 2L),
  normScore = c(15L, 20L, 18L, 24L)
)

fuzzy_left_join(df1, df2, by = c("testScore", "age" = "ageStart", "age" = "ageEnd"), match_fun = list(`==`, `>=`, `<=`)) %>%
  select(age, testScore = testScore.x, normScore)
#>    age testScore normScore
#> 1 78.6         1        15
#> 2 87.1         2        24