Вы не могли итерировать или хранить больше данных, чем длина вашего массива. В этом случае вы можете сделать так:
for (int i = 0; i <= name.length - 1; i++) {
// ....
}
Или это:
for (int i = 0; i < name.length; i++) {
// ...
}
Вот то, что походит на другой самый R-тип способ генерировать суммы. Генерируйте вектор, который является пока Ваш входной вектор, содержа только повторную сумму n элементов. Затем вычтите свой исходный вектор из вектора сумм. Результат: вектор (isums), где каждая запись является Вашим исходным вектором меньше ith элемент.
> (my.data$item[my.data$fixed==0])
[1] 1 1 3 5 7
> sums <- rep(sum(my.data$item[my.data$fixed==0]),length(my.data$item[my.data$fixed==0]))
> sums
[1] 17 17 17 17 17
> isums <- sums - (my.data$item[my.data$fixed==0])
> isums
[1] 16 16 14 12 10
Это не ответ, но интересно, находится ли понимание в этом направлении:
> tapply((my.data$item[my.data$fixed==0])[-1], my.data$year[my.data$fixed==0][-1], sum)
tapply производит таблицу статистики (суммы, в этом случае; третий аргумент) сгруппированный параметром, данным как второй аргумент. Например
2001 2003 2005 2007
1 3 5 7
[-1] нотация отбрасывает наблюдение (строка) один от выбранных строк. Так, Вы могли циклично выполнить и использовать [-i] на каждом цикле
for (i in 1:length(my.data$item)) {
tapply((my.data$item[my.data$fixed==0])[-i], my.data$year[my.data$fixed==0][-i], sum)
}
учет того факта, что, если у Вас есть какие-либо годы только с 1 наблюдением, затем таблицы, возвращенные последовательными вызовами tapply, не будут иметь того же числа столбцов. (т.е. если бы Вы опускаете единственное наблюдение на 2001, затем 2003, 2005, и 2007 был бы te только возвращенные столбцы).
Как ни странно, обучение векторизации в R помогло мне привыкнуть к основному функциональному программированию. Основной метод будет определять ваши операции внутри цикла как функцию:
data = ...;
items = ...;
leave_one_out = function(i) {
data1 = data[items != i];
delta = ...; # some operation on data1
return delta;
}
for (j in items) {
delta.list = cbind(delta.list, leave_one_out(j));
}
Для векторизации все, что вам нужно сделать, это заменить цикл для
на функцию отображения sapply
:
delta.list = sapply(items, leave_one_out);
]