#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