Проблема на самом деле ваша left_join, а не для l oop. Для будущих публикаций я бы рекомендовал вам также предоставить минимальный (isti c) пример.
Я покажу, что пошло не так в вашем коде.
Скажем, у нас есть эти фреймы данных , которая должна быть аналогична вашим реальным данным:
dt <- data.frame(
A = c(2,3,4),
B = c(20,30,40)
)
grid <- data.frame(
A_prop = c(0.5, 0.6),
B_prop = c(0.5, 0.4),
id = c(1,2),
tag = c("A_prop0.5", "A_prop0.6"))
Мы ожидаем следующих выходных данных:
Ожидаемый результат dt [1,] & A_prop 0,5 и B_prop 0,5
2 * 0,5 + 20 * 0,5 # = 11
Ожидаемый выход dt [2,] & A_prop 0,5 и B_prop 0,5
3 * 0,5 + 30 * 0,5 # = 16,5
Ожидаемый выходной сигнал dt [3,] & A_prop 0,5 и B_prop 0,5
4 * 0,5 + 40 * 0,5 # = 22 * 1020 *
Ожидаемый выходной сигнал dt [1,] & A_prop 0.6 и B_prop 0,4
2 * 0,6 + 20 * 0,4 # = 9,2
Ожидаемый выходной сигнал dt [1,] & A_prop 0,6 и B_prop 0,4 3 * 0,6 + 30 * 0,4 # = 13,8
Ожидаемый вывод dt [1,] & A_prop 0.6 и B_prop 0.4
4 * 0.6 + 40 * 0.4 # = 18.4
Я никогда не использовал библиотеку "magicfor", но проблема лежит в вашем способе присоединения i
и id
.
Я бы написал для l oop следующим образом:
l <- list()
for(i in grid$id){
score<-(dt$A*grid[i,1])+(dt$B*grid[i,2])
A<-dt$A
B<-dt$B
iteration <- rep(i, 3) # to keep track in which iteration the result was created.
l[[i]] <- list(
score = score,
A = A,
B = B,
iteration = iteration
)
}
Теперь я связываю список с фреймом данных и выполняю left_join, как вы делали в своем примере:
l <- bind_rows(l)
l_merged <- grid %>% left_join(l, by = c("id"="iteration")) %>%
mutate(score2 = (A*A_prop + B*B_prop))
Тест, в котором оценка и оценка2 одинаковы:
transmute(l_merged, identical = score == score2)
identical
1 TRUE
2 TRUE
3 TRUE
4 TRUE
5 TRUE
6 TRUE
Теперь к актуальной проблеме
Я адаптировал ваш код немного. Я добавил номер итерации к выводу.
magic_for(print, progress=FALSE,silent = TRUE)
for(i in grid$id){
score<-(dt$A*grid[i,1])+(dt$B*grid[i,2])
A<-dt$A
B<-dt$B
iteration <- rep(i, 3)
print(score)
print(A)
print(B)
print(iteration)
}
rest<-magic_result_as_dataframe()
magic_free()
Теперь, если мы посмотрим на вывод и сравним i
и iteration
, мы увидим, что они не идентичны. Поэтому ваш left_join()
дал сбивающий с толку результат.
rest %>% arrange(i)
i score A B iteration
1 1 11.0 2 20 1
2 1 22.0 4 40 1
3 1 13.8 3 30 2
4 2 16.5 3 30 1
5 2 9.2 2 20 2
6 2 18.4 4 40 2
Чтобы завершить, мы можем проверить его:
grid %>% left_join(rest, by = c("id"="i")) %>% # using i for the join
mutate(score2 = (A*A_prop + B*B_prop)) %>%
transmute(identical = score == score2)
identical
1 TRUE
2 TRUE
3 FALSE
4 FALSE
5 TRUE
6 TRUE
Соединение с i
не дает правильных результатов.
Но соединение с iteration
будет:
grid %>% left_join(rest, by = c("id"="iteration")) %>% # using the "manually" produced iteration for the join
mutate(score2 = (A*A_prop + B*B_prop)) %>%
transmute(identical = score == score2)
identical
1 TRUE
2 TRUE
3 TRUE
4 TRUE
5 TRUE
6 TRUE
Я не уверен, почему i
из "magicfor" отличается от созданного вручную iteration
. Я конечно получаю ваше замешательство ...