[R] If find x, then y, else do nothing

Joshua Wiley jwiley.psych at gmail.com
Mon Aug 8 17:43:37 CEST 2011


On Mon, Aug 8, 2011 at 8:23 AM, Edward Patzelt <patze003 at umn.edu> wrote:
> Thanks Josh for the code to post I have been trying to figure out how to do
> that.  Your code works except that it changes subjects that responded with
> "1 & 2" to all 1's.  What does the "ave" argument mean in the execution of

Not in the example data you provided on my system.  If you can provide
data (preferablly using dput() or uploading a txt file on a file
hosting service) that reproduces this issue, I will be happy to look
at it for you.  You might also try reporting your sessionInfo() ---
this may be related to the version of R or the packages you are using,
but at present I have no information.

> the function?

'ave' is not an argument in the function.  ave() *is* a function.  I
call with() to have the ave() function evaluated in an environment
created from dat (the data).  See ?ave and ?with  I could have
equivalently (though more cumbersomely) written:

ave(dat$Slide1_RESP, dat$Subject, FUN = foo))

because ave will now be evaluated in the global environment, it will
not have access to the variables stored in 'dat' unless explicitly
told that they are in dat (as above).

Cheers,

Josh

> library(car)
> foo <- function(x) {
>  if (any(grepl(4, x))) {
>    x <- recode(x, "2 = 1; 4 = 2")
>  }
>  return(x)
> }
> ## do it
> dat$test <- with(dat, ave(Slide1_RESP, Subject, FUN = foo))
> On Fri, Aug 5, 2011 at 4:56 PM, Joshua Wiley <jwiley.psych at gmail.com> wrote:
>>
>> On Fri, Aug 5, 2011 at 2:34 PM, Edward Patzelt <patze003 at umn.edu> wrote:
>> >
>> > The problem is that we were using a task where some subjects responded
>> > with "1 & 2" and some responded with "2 & 4".  So there is overlap for 2
>> > because it means stimulus 1 for subject 1 and it means stimulus 2 for
>> > subject 2.
>> >
>> > subject
>> >
>> > subject_1
>> >
>> > 1
>> >
>> > subject_1
>> >
>> > 1
>> >
>> > subject_1
>> >
>> > 1
>> >
>> > subject_1
>> >
>> > 2
>> >
>> > subject_1
>> >
>> > 2
>> >
>> > subject_2
>> >
>> > 4
>> >
>> > subject_2
>> >
>> > 2
>> >
>> > subject_2
>> >
>> > 2
>> >
>> > subject_2
>> >
>> > 4
>> >
>> > subject_2
>> >
>> > 2
>> >
>> > subject_2
>> >
>> > 2
>> >
>> > subject_2
>> >
>> > 2
>> >
>> > subject_2
>> >
>> > 4
>>
>> FYI providing data in the format above (this list is plain text) makes
>> the job of those trying to help substantially harder.  You can use
>> dput().  For example, if I wanted to share the first 10 rows of the
>> built in mtcars data set, I would just copy and paste the output from
>> running:
>>
>> dput(mtcars[1:10, ])
>>
>> Anyway, here you go, this should be directly executable as long as you
>> have installed the 'car' package.
>>
>> ## your data in a form easily copied and pasted into the console
>> ## created using dput() (highly recommended for future posts)
>> dat <- structure(list(subject = c("subject_1", "subject_1", "subject_1",
>> "subject_1", "subject_1", "subject_2", "subject_2", "subject_2",
>> "subject_2", "subject_2", "subject_2", "subject_2", "subject_2"
>> ), val = c(1, 1, 1, 2, 2, 4, 2, 2, 4, 2, 2, 2, 4)), .Names = c("subject",
>> "val"), row.names = c(NA, -13L), class = "data.frame")
>>
>> ## load the required package for recoding
>> ## though it is overkill for only two levels
>> require(car)
>>
>> ## define a function to do the recoding
>> foo <- function(x) {
>>  if (any(grepl(4, x))) {
>>    x <- recode(x, "2 = 1; 4 = 2")
>>  }
>>  return(x)
>> }
>>
>> ## do it
>> dat$altval <- with(dat, ave(val, subject, FUN = foo))
>>
>> Cheers,
>>
>> Josh
>>
>>
>> >
>> > On Fri, Aug 5, 2011 at 4:25 PM, Joshua Wiley <jwiley.psych at gmail.com>
>> > wrote:
>> >>
>> >> Hi Edward,
>> >>
>> >> You can try something like:
>> >>
>> >> u.ppl <- unique(init.dat1$grid)
>> >> l.ppl <- ifelse(grepl(4, init.dat1$Slide1_RESP), 2,
>> >>                init.dat1$Slide1_RESP)
>> >>
>> >> Note that this is not exact as you have not provided a reproducible
>> >> example.  I am not exactly sure how you are  putting 1 for 2 and 2 for
>> >> 4, if the value is equal to 4, but presumably it is clearer with data.
>> >>  In any event, look at ?ifelse it is something like a vectorized if
>> >> statement and is, I believe, preferable to your use of a for loop.  I
>> >> can probably give you a runnable solution if you can give the first
>> >> few rows of the relevant data.
>> >>
>> >> Cheers,
>> >>
>> >> Josh
>> >>
>> >> On Fri, Aug 5, 2011 at 2:15 PM, Edward Patzelt <patze003 at umn.edu>
>> >> wrote:
>> >> > I want to write code that says "If you find an element equal to 4 in
>> >> > this
>> >> > vector for each person in the data set tested separately, then put in
>> >> > 1 for
>> >> > 2 and 2 for 4, else leave the variable as is"
>> >> >
>> >> >  u.ppl <- (unique(init.dat1$grid))
>> >> >      l.ppl <- length(u.ppl)
>> >> >        for (i in 1:l.ppl)
>> >> >        {
>> >> >          if (grep("4",init.dat1$Slide1_RESP)) {2 == 1, 4 == 2}; else
>> >> > init.dat1$Slide1_RESP
>> >> >
>> >> >        }
>> >> >
>> >> > --
>> >> > Edward H. Patzelt
>> >> > Research Assistant – TRiCAM Lab
>> >> > University of Minnesota – Psychology/Psychiatry
>> >> > VA Medical Center
>> >> > Office: S355 Elliot Hall - Twin Cities Campus
>> >> > Phone: 612-626-0072  Email: patze003 at umn.edu
>> >> >
>> >> > Please consider the environment before printing this email
>> >> > www.psych.umn.edu/research/tricam
>> >> >
>> >> >        [[alternative HTML version deleted]]
>> >> >
>> >> >
>> >> > ______________________________________________
>> >> > R-help at 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.
>> >> >
>> >> >
>> >>
>> >>
>> >>
>> >> --
>> >> Joshua Wiley
>> >> Ph.D. Student, Health Psychology
>> >> Programmer Analyst II, ATS Statistical Consulting Group
>> >> University of California, Los Angeles
>> >> https://joshuawiley.com/
>> >
>> >
>> >
>> > --
>> > Edward H. Patzelt
>> > Research Assistant – TRiCAM Lab
>> > University of Minnesota – Psychology/Psychiatry
>> > VA Medical Center
>> > Office: S355 Elliot Hall - Twin Cities Campus
>> > Phone: 612-626-0072  Email: patze003 at umn.edu
>> >
>> > Please consider the environment before printing this email
>> > www.psych.umn.edu/research/tricam
>>
>>
>>
>> --
>> Joshua Wiley
>> Ph.D. Student, Health Psychology
>> Programmer Analyst II, ATS Statistical Consulting Group
>> University of California, Los Angeles
>> https://joshuawiley.com/
>
>
>
> --
> Edward H. Patzelt
> Research Assistant – TRiCAM Lab
> University of Minnesota – Psychology/Psychiatry
> VA Medical Center
> Office: S355 Elliot Hall - Twin Cities Campus
> Phone: 612-626-0072  Email: patze003 at umn.edu
>
> Please consider the environment before printing this email
> www.psych.umn.edu/research/tricam
>



-- 
Joshua Wiley
Ph.D. Student, Health Psychology
Programmer Analyst II, ATS Statistical Consulting Group
University of California, Los Angeles
https://joshuawiley.com/



More information about the R-help mailing list