Sorry I missed the boat the first time, and while it looks like Peter is
getting closer I suspect that is not quite there either due to the T2
being considered separate from T3 requirement.
Here is another stab at it:
library(dplyr)
# first approach is broken apart to show the progression of the innards
resultStep1 <- ( teste
%>% group_by( ID )
%>% mutate( Group = as.character( Group )
, transitionT2 = diff( c( FALSE, "T2"==
Group ) )
, transitionT3 = diff( c( FALSE, "T3"==
Group ) )
, groupseqT2 = cumsum( abs( transitionT2 ) )
, groupseqT3 = cumsum( abs( transitionT3 ) )
, isT2 = 1 == groupseqT2
, isT3 = 1 == groupseqT3
)
%>% as.data.frame
)
resultStep1
# notice how the groupseq columns number the groups of consecutive similar
# values, and you are only interested in the groups numbered 1.
# more compactly
result <- ( teste
%>% group_by( ID )
%>% mutate( Group = as.character( Group )
, keep = ( 1 == cumsum( abs( diff(
c( FALSE, "T2"== Group ) ) ) )
| 1 == cumsum( abs( diff(
c( FALSE, "T3"== Group ) ) ) )
)
)
%>% filter( keep )
%>% select( -keep )
%>% as.data.frame
)
#####> resultStep1
ID Group Var transitionT2 transitionT3 groupseqT2 groupseqT3 isT2 isT3
1 3 T2 0.32 1 0 1 0 TRUE FALSE
2 4 T3 1.59 0 1 0 1 FALSE TRUE
3 1 T2 2.94 1 0 1 0 TRUE FALSE
4 1 T2 3.23 0 0 1 0 TRUE FALSE
5 1 T2 1.40 0 0 1 0 TRUE FALSE
6 1 T2 1.62 0 0 1 0 TRUE FALSE
7 1 T2 2.43 0 0 1 0 TRUE FALSE
8 1 T2 2.53 0 0 1 0 TRUE FALSE
9 1 T2 2.25 0 0 1 0 TRUE FALSE
10 1 T3 1.66 -1 1 2 1 FALSE TRUE
11 1 T3 2.86 0 0 2 1 FALSE TRUE
12 1 T3 0.53 0 0 2 1 FALSE TRUE
13 1 T3 1.66 0 0 2 1 FALSE TRUE
14 1 T3 3.24 0 0 2 1 FALSE TRUE
15 1 T3 1.34 0 0 2 1 FALSE TRUE
16 1 T2 1.86 1 -1 3 2 FALSE FALSE
17 1 T2 3.03 0 0 3 2 FALSE FALSE
18 1 T3 3.63 -1 1 4 3 FALSE FALSE
19 1 T3 2.78 0 0 4 3 FALSE FALSE
20 1 T3 1.49 0 0 4 3 FALSE FALSE
21 2 T2 2.00 1 0 1 0 TRUE FALSE
22 2 T2 2.39 0 0 1 0 TRUE FALSE
23 2 T2 1.65 0 0 1 0 TRUE FALSE
24 2 T2 2.05 0 0 1 0 TRUE FALSE
25 2 T2 2.75 0 0 1 0 TRUE FALSE
26 2 T2 2.23 0 0 1 0 TRUE FALSE
27 2 T2 1.39 0 0 1 0 TRUE FALSE
28 2 T2 2.66 0 0 1 0 TRUE FALSE
29 2 T2 1.05 0 0 1 0 TRUE FALSE
30 2 T3 2.52 -1 1 2 1 FALSE TRUE
31 2 T2 2.49 1 -1 3 2 FALSE FALSE
32 2 T2 2.97 0 0 3 2 FALSE FALSE
33 2 T2 0.43 0 0 3 2 FALSE FALSE
34 2 T2 1.36 0 0 3 2 FALSE FALSE
35 2 T3 0.79 -1 1 4 3 FALSE FALSE
36 2 T3 1.71 0 0 4 3 FALSE FALSE
37 2 T3 1.95 0 0 4 3 FALSE FALSE
38 2 T2 2.73 1 -1 5 4 FALSE FALSE
39 2 T2 2.73 0 0 5 4 FALSE FALSE
40 2 T2 2.39 0 0 5 4 FALSE FALSE
41 2 T2 2.17 0 0 5 4 FALSE FALSE
42 2 T2 2.34 0 0 5 4 FALSE FALSE
43 2 T3 2.42 -1 1 6 5 FALSE FALSE
44 2 T3 1.75 0 0 6 5 FALSE FALSE
45 2 T3 0.66 0 0 6 5 FALSE FALSE
46 2 T3 1.64 0 0 6 5 FALSE FALSE
47 2 T2 0.24 1 -1 7 6 FALSE FALSE
48 2 T3 2.11 -1 1 8 7 FALSE FALSE
49 2 T3 2.11 0 0 8 7 FALSE FALSE
50 2 T3 1.18 0 0 8 7 FALSE FALSE
On Sun, 11 Oct 2015, peter dalgaard wrote:
> These situations where the desired results depend on the order of
observations in a dataset do tend to get a little tricky (this is one kind of
problem that is easier to handle in a SAS DATA step with its sequential
processing paradigm). I think this will do it:
>
> keep <- function(d)
> with(d, {
> n <- length(Group)
> i <- c(TRUE,Group[-n] != Group[-1])
> unsplit(lapply(split(i,Group), cumsum), Group) == 1
> })
> kp <- unsplit(lapply(split(teste, teste$ID), keep), teste$ID)
> teste[kp,]
>
> I.e. keep() is a function applied to each ID-subset of the data frame,
returning a logical vector of the observations that you want to keep.
>
> i is an indicator that an observation is the first in a sequence. Splitting
by group and cumsum'ing gives 1 for the first sequence, 2 for the next, etc.
The observations to keep are the ones for which this value is 1.
>
> -pd
>
>> On 10 Oct 2015, at 22:27 , Cacique Samurai <caciquesamurai at
gmail.com> wrote:
>>
>> Hello Jeff!
>>
>> Thanks very much for your prompt reply, but this is not exactly what I
>> need. I need the first sequence of records. In example that I send, I
>> need the first seven lines of group "T2" in ID "1"
(lines 3 to 9) and
>> others six lines of group "T3" in ID "1" (lines 10
to 15). I have to
>> discard lines 16 to 20, that represent repeated sequential records of
>> those groups in same ID.
>>
>> Others ID (I sent just a small piece of my data) I have much more
>> sequential lines of records of each group in each ID, and many
>> sequential records that should be discarded. I some cases, I have just
>> one record of a group in an ID.
>>
>> As I told, I tried to use a labeling variable, that mark first seven
>> lines 3 to 9 as 1 (first sequence of T2 in ID 1), lines 10 to 15 as 1
>> (first sequence of T3 in ID 1), lines 16 and 17 as 2 (second sequence
>> of T2 in ID 1) and lines 18 to 20 as 2 (second sequence of T3 in ID
>> 1), and so on... Then will be easy take just the first record by each
>> ID. But the code that I made was a long long loop sequence that at end
>> did not work as I want to.
>>
>> Once more, thanks in advanced for your atention and help,
>>
>> Raoni
>>
>> 2015-10-10 13:13 GMT-03:00 Jeff Newmiller <jdnewmil at
dcn.davis.ca.us>:
>>> ?aggregate
>>>
>>> in base R. Make a short function that returns the first element of
a vector and give that to aggregate.
>>>
>>> Or...
>>>
>>> library(dplyr)
>>> ( test %>% group_by( ID, Group ) %>% summarise( Var=first(
Var ) ) %>% as.data.frame )
>>>
---------------------------------------------------------------------------
>>> Jeff Newmiller The ..... ..... Go
Live...
>>> DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#.
##.#. Live Go...
>>> Live: OO#.. Dead: OO#..
Playing
>>> Research Engineer (Solar/Batteries O.O#. #.O#.
with
>>> /Software/Embedded Controllers) .OO#. .OO#.
rocks...1k
>>>
---------------------------------------------------------------------------
>>> Sent from my phone. Please excuse my brevity.
>>>
>>> On October 10, 2015 8:38:00 AM PDT, Cacique Samurai
<caciquesamurai at gmail.com> wrote:
>>>> Hello R-Helpers!
>>>>
>>>> I have a data-frame as below (dput in the end of mail) and need
to
>>>> select just the first sequence of occurrence of each
"Group" in each
>>>> "ID".
>>>>
>>>> For example, for ID "1" I have two sequential
occurrences of T2 and
>>>> two sequential occurrences of T3:
>>>>
>>>>> test [test$ID == 1, ]
>>>> ID Group Var
>>>> 3 1 T2 2.94
>>>> 4 1 T2 3.23
>>>> 5 1 T2 1.40
>>>> 6 1 T2 1.62
>>>> 7 1 T2 2.43
>>>> 8 1 T2 2.53
>>>> 9 1 T2 2.25
>>>> 10 1 T3 1.66
>>>> 11 1 T3 2.86
>>>> 12 1 T3 0.53
>>>> 13 1 T3 1.66
>>>> 14 1 T3 3.24
>>>> 15 1 T3 1.34
>>>> 16 1 T2 1.86
>>>> 17 1 T2 3.03
>>>> 18 1 T3 3.63
>>>> 19 1 T3 2.78
>>>> 20 1 T3 1.49
>>>>
>>>> As output, I need just the first group of T2 and T3 for this
ID, like:
>>>>
>>>> ID Group Var
>>>> 3 1 T2 2.94
>>>> 4 1 T2 3.23
>>>> 5 1 T2 1.40
>>>> 6 1 T2 1.62
>>>> 7 1 T2 2.43
>>>> 8 1 T2 2.53
>>>> 9 1 T2 2.25
>>>> 10 1 T3 1.66
>>>> 11 1 T3 2.86
>>>> 12 1 T3 0.53
>>>> 13 1 T3 1.66
>>>> 14 1 T3 3.24
>>>> 15 1 T3 1.34
>>>>
>>>> For others ID I have just one occurrence or sequence of
occurrence of
>>>> each Group.
>>>>
>>>> I tried to use a labeling variable, but cannot figure out do
this
>>>> without many many loops..
>>>>
>>>> Thanks in advanced,
>>>>
>>>> Raoni
>>>>
>>>> dput (teste)
>>>> structure(list(ID = structure(c(3L, 4L, 1L, 1L, 1L, 1L, 1L, 1L,
>>>> 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L,
>>>> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
>>>> 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label =
c("1", "2",
>>>> "3", "4"), class = "factor"),
Group = structure(c(1L, 2L, 1L,
>>>> 1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 2L,
>>>> 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 1L, 1L, 1L, 2L,
>>>> 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 2L),
.Label >>>> c("T2",
>>>> "T3"), class = "factor"), Var = c(0.32,
1.59, 2.94, 3.23, 1.4,
>>>> 1.62, 2.43, 2.53, 2.25, 1.66, 2.86, 0.53, 1.66, 3.24, 1.34,
1.86,
>>>> 3.03, 3.63, 2.78, 1.49, 2, 2.39, 1.65, 2.05, 2.75, 2.23, 1.39,
>>>> 2.66, 1.05, 2.52, 2.49, 2.97, 0.43, 1.36, 0.79, 1.71, 1.95,
2.73,
>>>> 2.73, 2.39, 2.17, 2.34, 2.42, 1.75, 0.66, 1.64, 0.24, 2.11,
2.11,
>>>> 1.18)), .Names = c("ID", "Group",
"Var"), row.names = c(NA, 50L
>>>> ), class = "data.frame")
>>>>
>>>> ______________________________________________
>>>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and
more, see
>>>> https://stat.ethz.ch/mailman/listinfo/r-help
>>>> PLEASE do read the posting guide
>>>> http://www.R-project.org/posting-guide.html
>>>> and provide commented, minimal, self-contained, reproducible
code.
>>>
>>
>>
>>
>> --
>> Raoni Rosa Rodrigues
>> Research Associate of Fish Transposition Center CTPeixes
>> Universidade Federal de Minas Gerais - UFMG
>> Brasil
>> rodrigues.raoni at gmail.com
>>
>> ______________________________________________
>> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
>> https://stat.ethz.ch/mailman/listinfo/r-help
>> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
>> and provide commented, minimal, self-contained, reproducible code.
>
> --
> Peter Dalgaard, Professor,
> Center for Statistics, Copenhagen Business School
> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
> Phone: (+45)38153501
> Email: pd.mes at cbs.dk Priv: PDalgd at gmail.com
>
>
>
>
>
>
>
>
>
---------------------------------------------------------------------------
Jeff Newmiller The ..... ..... Go Live...
DCN:<jdnewmil at dcn.davis.ca.us> Basics: ##.#. ##.#. Live
Go...
Live: OO#.. Dead: OO#.. Playing
Research Engineer (Solar/Batteries O.O#. #.O#. with
/Software/Embedded Controllers) .OO#. .OO#. rocks...1k