Другой альтернативой является обработка данных в длинном формате, а затем изменение формы. Это лучший метод, потому что это дорогостоящее выполнение построчных операций над data.frames. Вот базовое решение R с использованием модифицированной версии набора данных Тима.
reshape(dat[ave(dat$count, dat$Random, FUN=var) != 0, ],
direction="wide", idvar="Random", timevar="year")
Здесь ave(dat$count, dat$Random, FUN=var)
выбирает значения dat$Random
, которые имеют ненулевую дисперсию, возвращая TRUE. Результирующий вектор используется для подмножества data.frame, который затем широко преобразуется в желаемый формат с помощью функции reshape
базовой R.
Возвращает
Random count.2000 count.2001 count.2002 count.2003 count.2004 count.2005
1 A 1 0 2 1 4 5
5 E 2 3 0 0 1 1
6 F 0 0 1 0 0 0
Данные
dat <-
structure(list(Random = c("A", "B", "C", "D", "E", "F", "G",
"A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E", "F",
"G", "A", "B", "C", "D", "E", "F", "G", "A", "B", "C", "D", "E",
"F", "G", "A", "B", "C", "D", "E", "F", "G"), year = c(2000,
2000, 2000, 2000, 2000, 2000, 2000, 2001, 2001, 2001, 2001, 2001,
2001, 2001, 2002, 2002, 2002, 2002, 2002, 2002, 2002, 2003, 2003,
2003, 2003, 2003, 2003, 2003, 2004, 2004, 2004, 2004, 2004, 2004,
2004, 2005, 2005, 2005, 2005, 2005, 2005, 2005), count = c(1,
1, 0, 2, 2, 0, 3, 0, 1, 0, 2, 3, 0, 3, 2, 1, 0, 2, 0, 1, 3, 1,
1, 0, 2, 0, 0, 3, 4, 1, 0, 2, 1, 0, 3, 5, 1, 0, 2, 1, 0, 3)),
.Names = c("Random", "year", "count"), row.names = c(NA, -42L),
class = "data.frame")