Решение Base R:
# Reshape your dataframe from wide to long:
df3 <- reshape(df2,
direction = "long",
idvar = "letter",
varying = c(names(df2)[names(df2) != "letter"]),
v.names = "Value",
timevar = "Year",
times = names(df2)[names(df2) != "letter"],
new.row.names = 1:(nrow(df2) * length(names(df2)[names(df2) != "letter"]))
)
# Inner join the long_df with the first dataframe:
df_final <- merge(df1[,c(names(df1) != "Value")], df3, by = intersect(colnames(df1), colnames(df3)))
Решение Tidyverse (немного расширяется по решению @jdobres ниже):
lapply(c("dplyr", "tidyr"), require, character.only = TRUE)
df3_long <-
df2 %>%
pivot_longer(`2001`:`2004`, names_to = 'year', values_to = 'value') %>%
mutate(year = as.numeric(year)) %>%
inner_join(., df1, by = intersect(colnames(df1, df2)))
Данные:
df1 <-
structure(list(letter = c("A", "B", "C", "D"), year = 2001:2004),
class = "data.frame",
row.names = c(NA,-4L))
df2 <-
structure(
list(
letter = c("A", "B", "C", "D"),
`2001` = c(4L,
6L, 2L, 1L),
`2002` = c(9L, 7L, 3L, 1L),
`2003` = c(9L, 6L, 5L,
1L),
`2004` = c(9L, 6L, 8L, 1L)
),
class = "data.frame",
row.names = c(NA,-4L)
)