[R] OK - I got the data - now what? :-)
David Winsemius
dwinsemius at comcast.net
Sun Jul 5 18:53:46 CEST 2009
On Jul 5, 2009, at 12:19 PM, Mark Knecht wrote:
> On Sun, Jul 5, 2009 at 8:18 AM, David
> Winsemius<dwinsemius at 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
More information about the R-help
mailing list