[R] (no subject)

james.holtman@convergys.com james.holtman at convergys.com
Mon Jun 20 19:04:38 CEST 2005





'rle' might be your friend.  This will find the 'run of a sequence'

Here is some code working off the 'visit' data that you created.

# $Log$
x.1 <- matrix(visit, ncol=4)  # your data
x.rle <- apply(x.1, 1, rle)  # compute 'rle' for each row
Passed <- lapply(x.rle, function(x){  # now process each row see if it
meets the criteria
    .len <- length(x$lengths)
    if (x$lengths[.len] > 1 && x$values[.len] == 1) return(TRUE)  # last
two passed
    else if (.len == 2){ # two sequences
        if (x$lengths[.len] == 1 && x$values[.len] == 1) return(TRUE) #
only last passed
    }
    return(FALSE)
})
cbind(unlist(Passed), x.1)  # put results in first column with the data

Jim
__________________________________________________________
James Holtman        "What is the problem you are trying to solve?"
Executive Technical Consultant  --  Convergys Labs
james.holtman at convergys.com
+1 (513) 723-2929


                                                                                                                                           
                      r.ghezzo at staff.mcgill                                                                                                
                      .ca                          To:       r-help at stat.math.ethz.ch                                                      
                      Sent by:                     cc:                                                                                     
                      r-help-bounces at stat.m        Subject:  [R] (no subject)                                                              
                      ath.ethz.ch                                                                                                          
                                                                                                                                           
                                                                                                                                           
                      06/20/2005 11:58                                                                                                     
                                                                                                                                           





R friends,
I am using R 2.1.0 in a Win XP . I have a problem working with lists,
probably I
do not understand how to use them.

Lets suppose that a set of patients visit a clinic once a year for 4 years
on each visit a test, say 'eib' is performed with results 0 or 1
The patients do not all visit the clinic the 4 times but they missed a lot
of visits.
The test is considered positive if it is positive at the last 2 visits of
that
patient, or a more lenient definition, it is positive in the last visit,
and
never before.
Otherwise it is Negative = always negative or is a YoYo = unstable =
changes
from positive to negative.
So, if I codify the visits with codes 1,2,4,8 if present at year 1,2,3,4
and
similarly the tests positive I get the last2 list codifying the test code
corresponding to the visits patterns possible, similarly the last1 list
20 here means NULL

nobs <- 400
#  visits       0   1   2    3     4    5      6      7       8    9
last1 <- list((20),(1),(2),c(3,2),(4),c(5,4),c(6,4),c(7,6,4),(8),c(9,8),
#  visits      10      11         12      13         14         15

c(10,8),c(11,10,8),c(12,8),c(13,12,8),c(14,12,8),c(15,14,12,8))
#  visits       0   1    2    3   4    5   6    7     8    9
last2 <- list((20),(20),(20),(3),(20),(5),(6),c(7,6),(20),(9),
#  visits      10    11      12    13       14       15
              (10),c(11,10),(12),c(13,12),c(14,12),c(15,14,12))
#
#     simulate the visits
#
visit <- rbinom(nobs,1,0.7)
eib <- visit
#
#     simulate a positive test at a given visit
#
eib <- ifelse(runif(nobs) > 0.7,visit,0)
#
#     create the codes
#
viskode <- matrix(visit,ncol=4) %*% c(1,2,4,8)
eibkode <- matrix(eib,ncol=4) %*% c(1,2,4,8)
#
#    this is the brute force method, slow, of computing the Results
according to
#    the 2 definitions above. Add 16 to the test kode to signify YoYos,
Exactly
#    16 will be the negatives
#
 eibnoyoyo <- eibkode+16
 eiblst2 <- eibkode+16
 for(i in 1:nobs){
   if(eibkode[i] %in% last1[[viskode[i]+1]])
      eibnoyoyo[i] <- eibkode[i]
   if(eibkode[i] %in% last2[[viskode[i]+1]])
      eiblast2[i] <- eibkode[i]
 }
#
#    why is that these statements do not work?
#
eeibnoyoyo <- eeiblst2 <- rep(0,nobs)
eeibnoyoyo <- ifelse(eibkode %in% last1[viskode+1],eibkode,eibkode+16)
eeiblast2   <- ifelse(eibkode %in% last2[viskode+1],eibkode,eibkode+16)
#
table(viskode,eibkode)
table(viskode,eibnoyoyo)
table(viskode,eiblast2)
#
#  these two tables must be diagonal!!
#
table(eibnoyoyo,eeibnoyoyo)
table(eiblast2,eeiblast2)
#
Thanks for any help
Heberto Ghezzo
McGill University
Canada

______________________________________________
R-help at stat.math.ethz.ch mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide!
http://www.R-project.org/posting-guide.html




More information about the R-help mailing list