Это несколько , связанное с этим вопросом .
Вы также можете просто использовать функцию by () :
x2 <- by(x$Frequency, x$Category, sum)
do.call(rbind,as.list(x2))
Эти другие пакеты (plyr, reshape) имеют преимущество в возврате данных .frame, но это стоит знать с помощью (), поскольку это базовая функция.
Предполагая, что входящие данные уже отсортированы и что в каждой группе есть ноль или более последовательно ограниченных диапазонов от начала до конца:
data want;
do until (last.group);
set have;
by group time;
if event = 'Begin' then _keeprow = 1;
if _keeprow then output;
if event = 'End' then _keeprow = 0;
end;
drop _keeprow;
end;
Один из способов сделать это
data have;
input Time Group Event $ Value ;
datalines;
1 1 NA 0
2 1 NA 0
3 1 Begin 1.1
4 1 NA 1.2
5 1 NA 1.3
6 1 End 1.4
7 1 NA 0
1 2 NA 0
2 2 Begin 1.1
3 2 NA 1.2
4 2 End 1.3
5 2 NA 1.4
;
data have2(keep= Group min_var max_var);
set have;
by group;
retain min_var max_var;
if trim(Event)= "Begin" then min_var =_n_ ;
if trim(Event)= "End" then max_var =_n_;
if last.group;
run;
data want;
merge have have2;
by group;
if _n_ ge min_var and _n_ le max_var ;
drop min_var max_var;
run;
Я вышел простым способом, но буду ограничен фактическим размером данных.
data have;
input Time Group Event $ Value ;
datalines;
1 1 NA 0
2 1 NA 0
3 1 Begin 1.1
4 1 NA 1.2
5 1 NA 1.3
6 1 End 1.4
7 1 NA 0
1 2 NA 0
2 2 Begin 1.1
3 2 NA 1.2
4 2 End 1.3
5 2 NA 1.4
;
run;
proc sort data = have;
by group time;
run;
data have1;
set have;
count + 1;
by group;
if first.group then count = -100;
if event = 'Begin' then count = 0;
if event = 'End' then count = 100;
if count < 0 or count >100 then delete;
run;
Текущий код можно применить к данным небольшого размера, если у вас меньше 100 наблюдений между «Началом» и «Концом» и менее 100 наблюдений до «Начала». Вы можете настроить начальное значение счета в соответствии с истинным размером данных.