Векторизация моего мышления: векторные операции в R

Вы не могли итерировать или хранить больше данных, чем длина вашего массива. В этом случае вы можете сделать так:

for (int i = 0; i <= name.length - 1; i++) {
    // ....
}

Или это:

for (int i = 0; i < name.length; i++) {
    // ...
}
14
задан Joris Meys 10 August 2011 в 15:25
поделиться

3 ответа

Вот то, что походит на другой самый 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
8
ответ дан Wil Doane 11 August 2011 в 02:25
поделиться

Это не ответ, но интересно, находится ли понимание в этом направлении:

> 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 только возвращенные столбцы).

0
ответ дан Wil Doane 11 August 2011 в 02:25
поделиться

Как ни странно, обучение векторизации в 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);
]
8
ответ дан 1 December 2019 в 13:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: