1) Соединение влево DF1
и DF2
, а затем для каждого столбца Sec
разделите строку на value
. Наконец, удалите столбец value
.
library(dplyr)
DF1 %>%
left_join(DF2, by = "name") %>%
mutate(value = if_else(variable == "VA", value, 1L)) %>%
mutate_at(vars(starts_with("Sec")), ~ .x / value) %>%
select(-value)
, получив:
name variable year Sec1 Sec2 Sec3
1 CHN VA 1950 7.666667 15.000000 10.66667
2 CHN VA 1951 14.333333 15.000000 22.33333
3 CHN E 1950 45.000000 67.000000 87.00000
4 CHN E 1951 34.000000 53.000000 62.00000
5 IND VA 1950 7.500000 9.333333 4.00000
2) Базовая версия R будет:
m <- merge(DF1, DF2, by = "name", all.x = TRUE, all.y = FALSE)
ix <- m$variable == "VA"
jx <- grep("^Sec", names(m))
m[ix, jx] <- m[ix, jx] / m$value[ix]
m <- m[names(DF1)]
3) Другой подход заключается в преобразовании в длинную форму, выполнении объединения и деления и обратном преобразовании. Обратите внимание, что это приводит к переупорядочению строк.
library(dplyr)
library(tidyr)
DF1 %>%
gather(key, val, -name, -variable, -year) %>%
left_join(DF2, by = "name") %>%
mutate(value = if_else(variable == "VA", value, 1L)) %>%
mutate(val = val / value) %>%
spread(key, val)
4) Если вы не против написать это:
library(dplyr)
DF1 %>%
left_join(DF2, by = "name") %>%
mutate(value = if_else(variable == "VA", value, 1L)) %>%
mutate(Sec1 = Sec1 / value, Sec2 = Sec2 / value, Sec3 = Sec3 / value, value = NULL)
4a) или с основанием R:
m <- merge(DF1, DF2, by = "name", all.x = TRUE, all.y = FALSE)
m <- transform(m, value = ifelse(variable == "VA", value, 1))
transform(m, Sec1 = Sec1 / value, Sec2 = Sec2 / value, Sec3 = Sec3 / value, value = NULL)
Примечание
Lines1 <- "name variable year Sec1 Sec2 Sec3
CHN VA 1950 23 45 32
CHN VA 1951 43 45 67
CHN E 1950 45 67 87
CHN E 1951 34 53 62
IND VA 1950 45 56 24"
DF1 <- read.table(text = Lines1, header = TRUE, as.is = TRUE)
Lines2 <- "name value
CHN 3
IND 6
MLY 7
EUR 4"
DF2 <- read.table(text = Lines2, header = TRUE, as.is = TRUE)