Эту задачу лучше всего решить, преобразовав второй фрейм данных в длинный фрейм, а затем присоединив его к первому фрейму данных. Существует множество способов выполнить sh в R
, вот простой способ сделать это в tidyverse
, в частности с dplyr
и tidyr
функциями.
# Recreating your data
df1 <- tibble::tribble(
~Teacher, ~Student, ~Age,
"0123", 1, 7,
"0145", 1, 7,
"0163", 1, 7,
"0175", 2, 8,
"0123", 2, 8,
"0194", 2, 8,
"0123", 3, 7,
"0145", 3, 7
)
df2 <- tibble::tribble(
~Teacher, ~Age.7, ~Age.8, ~Age.9,
"0123", 1, 1, 1,
"0145", 5, 7, 3,
"0163", 4, 7, 1,
"0175", 6, 8, 1,
"0183", 3, 8, 1,
"0194", 2, 8, 1,
"0120", 3, 7, 4
)
# Load necessary libs
library(dplyr, warn.conflicts = FALSE)
library(tidyr)
tidyr::pivot_longer()
преобразует df2 в длинный формат, а dplyr::mutate()
с gsub()
и as.numeric()
используются для сброса остатка из имен переменных и преобразования в объединения dbl.
df2_long <-
df2 %>%
pivot_longer(Age.7:Age.9,
names_to = "Age",
values_to = "AgeStereotype") %>%
mutate(Age = as.numeric(gsub("Age.", "", Age)))
dplyr::left_join()
наборы данных, содержащие только тех учителей, у которых есть строка в df1
.
left_join(df1, df2_long)
#> Joining, by = c("Teacher", "Age")
#> # A tibble: 8 x 4
#> Teacher Student Age AgeStereotype
#> <chr> <dbl> <dbl> <dbl>
#> 1 0123 1 7 1
#> 2 0145 1 7 5
#> 3 0163 1 7 4
#> 4 0175 2 8 8
#> 5 0123 2 8 1
#> 6 0194 2 8 8
#> 7 0123 3 7 1
#> 8 0145 3 7 5