Мы можем использовать row/column
индексирование для извлечения значений путем match
, используя столбцы «Код» в качестве индекса строки и «имена дат / столбцов» двух наборов данных, чтобы получить индекс столбца (без использования любые внешние пакеты)
cbind(df1['Region'], Results = df2[-1][cbind(match(df1$Code, df2$Code),
match(df1$date,
sub('^X(\\d{4})\\.', "\\1-", names(df2)[-1])))])
# Region Results
#1 1 25
#2 2 21
#3 3 34
#4 4 37
#5 5 45
ПРИМЕЧАНИЕ. Имена столбцов в записи ОП имели в начале ^X
, а его формат был .
вместо -
, поскольку он был создан с помощью check.names = TRUE
( по умолчанию)
, если наборы данных были созданы с помощью check.names = FALSE
, приведенное выше решение может быть дополнительно упрощено
cbind(df1['Region'], Results = df2[-1][cbind(match(df1$Code, df2$Code),
match(df1$date, names(df2)[-1]))])
# Region Results
#1 1 25
#2 2 21
#3 3 34
#4 4 37
#5 5 45
Обновление
Если имена столбцов дублируются и хочет найти соответствие на основе этой информации, тогда
i1 <- duplicated(df1$date)
v1 <- numeric(nrow(df1))
v1[!i1] <- df2[-1][cbind(match(df1$Code[!i1],
df2$Code),match(df1$date[!i1], names(df2)[-1]))]
v1[i1] <- rev(df2[-1])[cbind(match(df1$Code[i1],
df2$Code),match(df1$date[i1], rev(names(df2)[-1])))]
cbind(df1['Region'], Results = v1)
# Region Results
#1 1 25
#2 2 21
#3 3 34
#4 4 45
#5 5 45
ПРИМЕЧАНИЕ. Внешние пакеты не используются