Это не ответ, но интересно, находится ли понимание в этом направлении:
> 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 только возвращенные столбцы).
Один из классов Коллекции. Он позволяет вам получить доступ к элементам в вашей коллекции по ключу или последовательно по ключу. У него значительно больше накладных расходов, чем у ArrayList или HashMap. Используйте HashSet, когда вам не нужен последовательный доступ, просто ищите по ключу. Используйте ArrayList и используйте массивы. сортируйте, если вы просто хотите, чтобы элементы были в порядке. TreeSet постоянно поддерживает порядок элементов. С ArrayList вы просто сортируете, когда вам нужно. С помощью TreeSets ключ должен быть встроен в объект, который вы храните в коллекции. Часто у вас может быть TreeSet of Strings. Все, что вы можете сделать, это сказать, находится ли данная строка в наборе. Он не найдет вам связанный объект, как Treemap. В TreeMap ключи и объекты, с которыми они связаны, разделены.
TreeSet и его брат TreeMap, как ни странно, не имеют ничего общего с представлением деревьев. Внутри они используют древовидную организацию, чтобы дать вам отсортированный по алфавиту набор / карту, но вы не можете контролировать связи между родителями и детьми.
Внутренне TreeSet использует красно-черные деревья. Нет необходимости предварительно сортировать данные, чтобы получить хорошо сбалансированное дерево. С другой стороны, если данные отсортированы (по возрастанию или по убыванию), это не повредит, как это происходит с некоторыми другими типами дерева.
Если вы не предоставляете Comparator для определения желаемого порядка, TreeSet требует реализации Comparable в классе элементов для определения естественного порядка.
Минусы: Одна ловушка с TreeSet заключается в том, что он неожиданным образом реализует интерфейс Set. Если TreeSet содержит объект a, то объект b считается частью набора, если a.compareTo (b) возвращает 0, даже если a.equals (b) имеет значение false, поэтому, если compareTo и equals не реализованы согласованным образом , вас ждет плохая поездка.
Это особенно проблема, когда метод возвращает Set, и вы не знаете, является ли реализация TreeSet или, например, HashSet.
Урок для здесь учиться, всегда избегайте непоследовательной реализации compareTo и equals. Если вам нужно упорядочить объекты способом, несовместимым с равенством, используйте компаратор.
TreeSet:
Плюсы: сортировка, основанная на алгоритме красного / черного дерева, обеспечивает сложность операций O (log (N)).
Минусы: значение должно быть либо Comparable , либо вам необходимо указать Comparator в конструкторе. Более того, реализация HashSet обеспечивает лучшую производительность, поскольку обеспечивает сложность ~ O (1).
Я предполагаю, что эта структура данных будет использовать двоичное дерево для хранения данных, чтобы было возможно извлечение в порядке возрастания. В этом случае, если он попытается сохранить баланс дерева, операция удаления будет немного дорогостоящей.
TreeSet фрагментирует память и имеет дополнительные накладные расходы на память. Вы можете просмотреть источники и рассчитать объем дополнительной памяти и количество дополнительных объектов, которые она создает. Конечно, это зависит от характера хранимых объектов, и вы также можете заподозрить, что я параноик по поводу памяти :) но лучше не тратить его здесь и там - у вас есть сборщик мусора, у вас есть промахи в кеше, и все эти вещи медленные.
Часто можно использовать PriorityQueue вместо TreeSet. И в вашем типичном случае лучше просто отсортировать массив строк.