On Jul 5, 2009, at 12:19 PM, Mark Knecht wrote:

On Sun, Jul 5, 2009 at 8:18 AM, David Winsemius<dwinsem...@comcast.net> wrote:

On Jul 5, 2009, at 10:50 AM, Uwe Ligges wrote:



David Winsemius wrote:

So if your values are calculated from other values then consider using
all.equal()
And repeated applications of the testing criteria process are effective:
test[3,][which(names(test)=="C1"):(which(test[3,] == 0.0)-1)]
  C1   C2   C3
3 0.52 0.66 0.51
(and a warning that does not seem accurate to me.)
In which(names(test) == "C1"):(which(test[3, ] == 0) - 1) :
 numerical expression has 3 elements: only the first used


David,

# which(test[3,] == 0.0)
[1] 6 7 8

and in a:b a and b must be length 1 vectors (scalars) otherwise just the
first element (in this case 6) is used.

That leads us to the conclusion that writing the line above is not really
the cleanest way or you intended something different ....

Thanks, Uwe. I see my confusion. I did want 6 to be used and it looks as though I would not be getting in truouble this way, but a cleaner method
would be to access only the first element of which(test[3, ] == 0):

test[3,][ which(names(test) == "C1") : (which(test[3,] == 0.0) [1]-1) ]


David

Seems to me that all of the element were used. I cannot explain that
warning but am pretty sure it can be ignored.


David

OK - making lots more headway. Thanks for your help.

QUESTION: How do I handle the case where I'm testing for 0 and don't
find it? In this case I need to all of the row from C1:C6.

test <- data.frame(A=1:10, B=100, C1=runif(10), C2=runif(10),
C3=runif(10), C4=runif(10), C5=runif(10), C6=runif(10))
test<-round(test,2)

#Make array ragged
test$C3[2]<-0;test$C4[2]<-0;test$C5[2]<-0;test$C6[2]<-0
test$C4[3]<-0;test$C5[3]<-0;test$C6[3]<-0
test$C6[7]<-0
test$C4[8]<-0;test$C5[8]<-0;test$C6[8]<-0

test

#C1 always the same so calculate it only once
StartCol <- which(names(test)=="C1")

#Print row 3 explicitly
test[3,][StartCol :(which(test[3,] == 0.0)[1]-1)]

#Row 6 fails because 0 is not found
test[6,][StartCol :(which(test[6,] == 0.0)[1]-1)]

EndCol <- which(test[6,] == 0.0)[1]-1
EndCol


It's getting a bit Baroque, but here is a solution that handles an NA:

test[6,][StartCol :ifelse(is.na( which(test[6,] == 0.0)[1]) ,
ncol(test), which(test[6,] == 0.0) [1]-1 )
            ]
#####-----
    C1   C2   C3   C4   C5   C6
6 0.33 0.84 0.51 0.86 0.84 0.15


Maybe an R-meister can offer something more compact?

David Winsemius, MD
Heritage Laboratories
West Hartford, CT

______________________________________________
R-help@r-project.org mailing list
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.

Reply via email to