Структура моего фрейма данных data1
, содержащего более 1,5 миллионов строк, выглядит следующим образом:
data1 <- data.frame(NEW_UPC=c(11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005991,11820005992,11820005992,11820005992,11820005992,11820005992,11820005992,11820005992,11820005992,11820005992,11820005993,11820005993,11820005993,11820005993,11820005993,11820005993,11820005993,11820005993,11820005993,11820005994,11820005994,11820005994,11820005994,11820005994,11820005994,11820005995,11820005995,11820005995,11820005995,11820005995,11820005995,11820005995,11820005995,11820005995),
IRI_KEY=c(1073521,1073521,1073521,1073525,1073525,1073525,1078106,1078106,1078106,1078107,1078107,1078107,1073521,1073521,1073521,1073525,1073525,1073525,1078106,1078106,1078106,1073521,1073521,1073521,1073525,1073525,1073525,1078106,1078106,1078106,1073521,1073521,1073525,1073525,1078106,1078106,1073521,1073521,1073521,1073525,1073525,1073525,1078106,1078106,1078106),
WEEK = c(1229,1230,1232,1218,1224,1229,1282,1285,1287,1229,1230,1232,1229,1230,1232,1218,1224,1229,1282,1285,1287,1229,1230,1232,1217,1221,1227,1270,1272,1273,1273,1274,1270,1272,1217,1221,1229,1230,1232,1218,1224,1229,1282,1285,1287),
END=c(1232,1232,1232,1229,1229,1229,1287,1287,1287,1232,1232,1232,1232,1232,1232,1229,1229,1229,1287,1287,1287,1232,1232,1232,1227,1227,1227,1273,1273,1273,1274,1274,1272,1272,1221,1221,1232,1232,1232,1229,1229,1229,1287,1287,1287))
Мне нужно вставить столбец Exit.time
, используя значения в столбцах WEEK
и END
и значение отсечения, равное 1287. Exit.time
должно иметь значение 0 или 1 на основе следующей логики:
если WEEK
= 1287, то Exit.time
= 0.
если Week
не равно 1287, но WEEK
= END
, тогда Exit.time
= 1, в противном случае Exit.time
= 0.
Для этого я попробовал следующее для цикла, и он делает то, что требуется в указанном выше наборе фиктивных данных.
i=0
for(i in 1:length(data2$NEW_UPC)){
if (data2$WEEK[i]==1287) {
data2$Exit.time[i] <- 0
} else if(data2$WEEK[i]==data2$END[i]) {
data2$Exit.time[i] <- 1
} else {
data2$Exit.time[i] <- 0
}
}
Проблема в том, что когда я использую вышеуказанный цикл в моем реальном наборе данных, даже через час я не получаю вывод. Я полагаю, что циклы не эффективны, учитывая размер набора данных. Есть ли альтернативный способ сделать то, что я хочу? Я предпочитаю поддерживать порядок строк в data1
, так как позже мне потребуется выполнить некоторые операции слияния.