Вот ответ, который работает, хотя он не обязательно способен масштабироваться для больших наборов данных:
df <- data.frame(Thing=c("Abcd", "Y682", "BH", "Jd"),
stuff=c("A","B","A","B"),
G1=c(42,3,22,2),
G2=c(17,12,10,3),
G3=c(0,9,1,12))
df2 <- data.frame(G1=45, G2=30, G3=15)
for(i in 3:ncol(df)){
df[, i] <- df[, i]/df2[, i-2]*100
}
Это зависит от правильного порядка столбцов во втором фрейме данных
РЕДАКТИРОВАТЬ: это лучший способ, при котором столбцы не находятся в правильном порядке, но вам все равно нужны имена столбцов для соответствия между фреймами данных:
for (i in names(df)){
if (exists(where = df2, x = i)){
df[, i] <- format(as.numeric(df[, i])/df2[, which(names(df2)==i)], digits=2)
}
}