Удаление временного ряда только с нулевыми значениями из фрейма данных

У меня есть фрейм данных с несколькими временными рядами, идентифицированными уникальными идентификаторами. Я хотел бы удалить любой временной ряд, который имеет только 0 значений.

Фрейм данных выглядит следующим образом,

id   date          value
AAA  2010/01/01    9
AAA  2010/01/02    10
AAA  2010/01/03    8
AAA  2010/01/04    4
AAA  2010/01/05    12
B    2010/01/01    0
B    2010/01/02    0
B    2010/01/03    0
B    2010/01/04    0
B    2010/01/05    0
CCC  2010/01/01    45
CCC  2010/01/02    46
CCC  2010/01/03    0
CCC  2010/01/04    0
CCC  2010/01/05    40

Я хочу, чтобы любой временной ряд только с 0 значениями был удален, чтобы кадр данных выглядел следующим образом:

id   date          value
AAA  2010/01/01    9
AAA  2010/01/02    10
AAA  2010/01/03    8
AAA  2010/01/04    4
AAA  2010/01/05    12
CCC  2010/01/01    45
CCC  2010/01/02    46
CCC  2010/01/03    0
CCC  2010/01/04    0
CCC  2010/01/05    40

Это продолжение предыдущего вопроса, на который было дано действительно отличное решение с использованиемdata.tables пакет.

R эффективно удаляет пропущенные значения из начала и конца нескольких временных рядов в одном кадре данных

 Fhnuzoag30 мая 2012 г., 17:30
Идентификаторы фрейма данных всегда сортируются?
 sizeight31 мая 2012 г., 07:16
@Fhnuzoag Я отсортировал фрейм данных по идентификатору и дате
 Fhnuzoag31 мая 2012 г., 10:06
Если кадр данных уже отсортирован, то, вероятно, есть более быстрые способы сделать это, чем метод ave. Но, вероятно, оно того не стоит.

Ответы на вопрос(3)

Решение Вопроса

Еслиdat этоdata.tableтогда это легко написать и прочитать:

dat[,.SD[any(value!=0)],by=id]

.SD обозначает Подмножество данных.Этот ответ объясняет.SD отлично.

Подбирая приятное использование Габораave, но без повторения того же имени переменной (DF) три раза, которые могут стать источником ошибок опечаток, если у вас много длинных или похожих имен переменных, попробуйте:

dat[ ave(value!=0,id,FUN=any) ]

Разница в скорости между этими двумя может зависеть от нескольких факторов, включая: i) количество групп ii) размер каждой группы и iii) количество столбцов в реальномdat.

 sizeight31 мая 2012 г., 07:11
Спасибо за решение. Ваш пакет data.table действительно полезен. Собираюсь сделать обработку данных намного проще для себя.

plyr решение будет

ddply(mydat,"id",function(x) if (all(x$value==0)) NULL else x)

(кажется, работает нормально), но может быть более быстрое решение сdata.table ...

DF[ ave(DF$value != 0, DF$id, FUN = any), ]

Ваш ответ на вопрос