Я пытаюсь преобразовать новый столбец в очень большой фрейм данных, используя комбинации двух переменных для получения значения из другого фрейма данных. Я знаю, что могу сделать это без использования цикла for, но исходный фрейм данных составляет ~ 2,7 миллиона строк, поэтому цикл for занимает слишком много времени.
По сути, у меня есть два кадра данных, таких как:
df1 = data.frame(cbind(years = c(2001:2005), sites = c(1:5), var1 = rnorm(n=5)))
df1
years sites var1
1 2001 1 -0.01419947
2 2002 2 0.53729311
3 2003 3 0.89222231
4 2004 4 0.20600240
5 2005 5 0.24541548
df2 = data.frame(cbind(`2001` = rnorm(n = 5, mean = 2, sd = 1),
`2002` = rnorm(n = 5, mean = 2, sd = 1),
`2003` = rnorm(n = 5, mean = 2, sd = 1),
`2004` = rnorm(n = 5, mean = 2, sd = 1),
`2005` = rnorm(n = 5, mean = 2, sd = 1)))
colnames(df2) = c(2001:2005); rownames(df2) = c(1:5)
df2
2001 2002 2003 2004 2005
1 -0.1217767 0.6703649 3.6074038 2.3048512 3.0022530
2 2.6167986 1.7673236 0.9467254 0.9903685 1.8533297
3 0.3192424 2.2183726 0.8783466 2.7741821 0.1847018
4 2.3599459 0.5653315 3.8843616 3.3171480 2.9135520
5 1.5399871 2.8127713 1.2168152 2.1788167 2.1153329
, где для df2
имена столбцов - это годы, имена строк - это сайты, а в фактической версии df1
каждая комбинация год / сайт присутствует много раз.
Я бы хотел закончить с:
years sites var1 NewVar
1 2001 1 -0.01419947 1.322451
2 2002 2 0.53729311 3.083238
3 2003 3 0.89222231 1.106300
4 2004 4 0.20600240 2.723593
5 2005 5 0.24541548 2.4919137
Так, что переменная NewVar
создается на основе комбинации значений в years
и sites
, которые указывают соответствующее значение для извлечения из df2.
Что я хочу сделать, это mutate
столбец в df1, который для каждой строки использует комбинацию переменных сайта и года, чтобы найти соответствующее значение в df2
. Как я упоминал ранее, я знаю, что это возможно сделать с циклом for, но на компьютере, на котором я работаю, аналогичный цикл foreach занимал 6 часов на 3 ядрах, поэтому я действительно надеюсь на более быструю версию с мутированием.
Единственная другая мысль для решения, которое у меня было до сих пор, - это использовать комбинацию индексации и тонны операторов ifelse
, но реальные версии фреймов данных, с которыми я работаю, имеют 702 уникальных комбинации сайта. и годы.
Любая помощь будет принята с благодарностью!