Использование aggregate
с номером unique
(length(unique)
)
filterdf=aggregate(Value ~ Class, df, function(x) length(unique(x)))
df[df$Class%in%filterdf[filterdf$Value==1,]$Class,]
Class Value
1 A 5.40
2 A 5.40
3 A 5.40
6 C 4.02
7 C 4.02
8 C 4.02
9 D 6.33
10 D 6.33
Альтернатива от Маркуса
idx <- with(df, ave(Value, Class, FUN = function(x) length(unique(x))) == 1)
df[idx, ]
bbxbby, лучшим решением обычно является самое простое. Вы определенно не сверхусложняете вещи, создающие отдельный объект итератора. На самом деле PHP поддерживает и поощряет такое обеспечение агрегирования IteratorAggregate
интерфейс. Реализация объектов IteratorAggregate
должен содержать getIterator()
возврат метода Iterator
. Это действительно что Ваш getChocolated()
метод делает. Хорошая вещь о IteratorAggregate
это, можно передать объект его непосредственно к foreach
цикл. Ваш код мог бы быть похожим как этот при использовании его:
class BoxOfChocolates implements IteratorAggregate
private $chocolates = array();
public function getIterator() {
return new ArrayIterator(new ArrayObject($this->chocolates)));
}
}
И затем, где-нибудь в коде:
$box = new BoxOfChocolates();
foreach ($box as $chocolate) { ... }
Ну, я не знаю PHP, таким образом, я не могу правильно ответить на вопрос, но я попытаюсь связать его с областью, которую я действительно знаю.
В C# существует два интерфейса: IEnumerable и IEnumerator. В Вашем примере BoxOfChocolates был бы Счетным, Конфетами будет Перечислитель.
Enumerables просто имеют метод, который возвращает Перечислитель. Перечислители имеют понятие текущего объекта и средство перемещения в следующий объект. В большинстве случаев класс Перечислителя не "замечен". Например, в строке "foreach (Шоколадный объект в boxOfChoclates)" boxOfChocolates Счетное; объект Перечислителя полностью скрыт foreach.
Вполне просто контейнер является местом для реализации итератора.
Я думаю, что необходимо разделить наборы от итераторов. Я согласился бы с @James Curran, что наборы часто имеют итераторы - на самом деле, у них могли быть несколько. Например, можно хотеть итератор, который пропускает леденец с гайками (хотя типичный случай должен хотеть тот, который инвертирует упорядочивание). В этом случае значение следующего () изменения метода. Для обработки этого реализуйте итераторы в отдельных классах, которые содержат их собственную итеративную семантику. Предоставьте методы в наборе для получения итераторов надлежащего вида. Это - действительно проблема разделения проблем. Набор не заботится, как пользователь выполняет итерации по нему, который является беспокойством итератора.
Это зависит от ситуации. Поле конфет идет, t0 содержат несколько наборов? Раз так у Вас должны быть наборы быть участниками.
Думайте о нем этот путь. Поле конфет набор (т.е. PersonList) или что-то, что владеет набором (т.е. автомобиль может владеть набором, он - последние владельцы).
Я думаю, что это подпадает под первую группу
:)
я предложил бы первую группу также, предположив, что Ваша шоколадная метафора симпатична с точностью до фактического класса.
поле конфет действительно является Вашим набором конфет, и как таковой, имеет смысл хотеть выполнить итерации по конфетам в том поле. добавление отдельного шоколадного списка действительно не добавляет значения и просто, кажется, добавляет ненужный слой.