Thank you - I will try this solution as well.

Sent via DROID X


-----Original message-----
From: Petr PIKAL <petr.pi...@precheza.cz>
To: David Herzberg <dav...@wpspublish.com>
Cc: Adrienne Wootten <amwoo...@ncsu.edu>, "r-help@r-project.org" 
<r-help@r-project.org>
Sent: Tue, Oct 26, 2010 06:43:09 GMT+00:00
Subject: Re: [R] Conditional looping over a set of variables in R

Hi

r-help-boun...@r-project.org napsal dne 25.10.2010 20:41:55:

> Adrienne, there's one glitch when I implement your solution below. When
the
> loop encounters a case with no data at all (that is, all 140 item
responses
> are missing), it aborts and prints this error message: " ERROR: argument
is
> of length zero".
>
> I wonder if there's a logical condition I could add that would enable R
to
> skip these empty cases and continue executing on the next case that
contains data.
>
> Thanks, Dave
>
> David S. Herzberg, Ph.D.
> Vice President, Research and Development
> Western Psychological Services
> 12031 Wilshire Blvd.
> Los Angeles, CA 90025-1251
> Phone: (310)478-2061 x144
> FAX: (310)478-7838
> email: dav...@wpspublish.com
>
>
>
> From: wootten.adrie...@gmail.com [mailto:wootten.adrie...@gmail.com] On
Behalf
> Of Adrienne Wootten
> Sent: Friday, October 22, 2010 9:09 AM
> To: David Herzberg
> Cc: r-help@r-project.org
> Subject: Re: [R] Conditional looping over a set of variables in R
>
> David,
>
> here I'm referring to your data as testmat, a matrix of 140 columns and
1500
> rows, but the same or similar notation can be applied to data frames in
R.  If
> I understand correctly, you are looking for the first response (column)
where
> you got a value of 1.  I'm assuming also that since your missing values
are
> characters then your two numeric values are also characters.  keeping
all this
> in mind, try something like this.

If you really only want to know which column in each row has first
occurrence of 1 (or any other value)  you can get rid of looping and use
other R capabilities.

> set.seed(111)
> mat<-matrix(sample(1:3, 20, replace=T),5,4)
> mat
     [,1] [,2] [,3] [,4]
[1,]    2    2    2    2
[2,]    3    1    2    1
[3,]    2    2    1    3
[4,]    2    2    1    1
[5,]    2    1    1    2
> mat.w<-which(mat==1, arr.ind=T)
> tapply(mat.w[,2], mat.w[,1], min)
2 3 4 5
2 3 3 2
> mat[2, ]<-NA
> mat
     [,1] [,2] [,3] [,4]
[1,]    2    2    2    2
[2,]   NA   NA   NA   NA
[3,]    2    2    1    3
[4,]    2    2    1    1
[5,]    2    1    1    2

and this approach smoothly works with NA values too

> mat.w<-which(mat==1, arr.ind=T)
> tapply(mat.w[,2], mat.w[,1], min)
3 4 5
3 3 2

You can then use modify such output as you have info about columns and
rows. I am sure there are other maybe better options, e.g.

lll<-as.list(as.data.frame(t(mat)))
> unlist(lapply(lll, function(x) min(which(x==1))))
 V1  V2  V3  V4  V5
Inf Inf   3   3   2

Regards
Petr

>
> first = c() # your extra variable which will eventually contain the
first
> correct response for each case
>
> for(i in 1:nrow(testmat)){
>
> c = 1
>
> while( c<=ncol(testmat) | testmat[i,c] != "1" ){
>
> if( testmat[i,c] == "1"){
>
> first[i] = c
> break # will exit the while loop once it finds the first correct answer,
and
> then jump to the next case
>
>  } else {
>
> c=c+1 # procede to the next column if not
>
> }
>
> }
>
> }
>
>
> Hope this helps you out a bit.
>
> Adrienne Wootten
> NCSU
>
> On Fri, Oct 22, 2010 at 11:33 AM, David Herzberg <dav...@wpspublish.com<
> mailto:dav...@wpspublish.com>> wrote:
> Here's the problem I'm trying to solve in R: I have a data frame that
consists
> of about 1500 cases (rows) of data from kids who took a test of
listening
> comprehension. The columns are their scores (1 = correct, 0 = incorrect,
 . =
> missing) on 140 test items. The items are numbered sequentially and are
> ordered by increasing difficulty as you go from left to right across the

> columns. I want R to go through the data and find the first correct
response
> for each case. Because of basal and ceiling rules, many cases have
missing
> data on many items before the first correct response appears.
>
> For each case, I want R to evaluate the item responses sequentially
starting
> with item 1. If the score is 0 or missing, proceed to the next item and
> evaluate it. If the score is 1, stop the operation for that case, record
the
> item number of that first correct response in a new variable, proceed to
the
> next case, and restart the operation.
>
> In SPSS, this operation would be carried out with LOOP, VECTOR, and DO
IF, as
> follows (assuming the data set is already loaded):
>
> * DECLARE A NEW VARIABLE TO HOLD THE ITEM NUMBER OF THE FIRST CORRECT
> RESPONSE, SET IT EQUAL TO 0.
> numeric LCfirst1.
> comp LCfirst1 = 0
>
> * DECLARE A VECTOR TO HOLD THE 140 ITEM RESPONSE VARIABLES.
> vector x=LC1a_score to LC140a_score.
>
> * SET UP A LOOP THAT WILL RUN FROM 1 TO 140, AS LONG AS LCfirst1 = 0.
"#i" IS
> AN INDEX VARIABLE THAT INCREASES BY 1 EACH TIME THE LOOP RUNS.
> loop #i=1 to 140 if (LCfirst1 = 0).
>
> * SET UP A CONDITIONAL TRANSFORMATION THAT IS EVALUATED FOR EACH ELEMENT
OF
> THE VE

        [[alternative HTML version deleted]]

______________________________________________
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