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

Joshua Wiley jwiley.psych at gmail.com
Mon Aug 8 18:14:32 CEST 2011


Hmm, well I suppose it technically does "touch" in some sense still if
there are 1 & 2s, but it should just return it as is, not changed.
Thanks for the data, very easy!  Here is what I get:

dat <- structure(list(subject = c(8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L,
8L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 6L, 6L,
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), resp = c(2, 1, 1, 2, 1, 2, 1,
1, 1, 1, 4, 4, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2,
1, 2)), .Names = c("subject", "resp"), row.names = c(1L, 2L,
3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 4161L, 4162L, 4163L, 4164L,
4165L, 4166L, 4167L, 4168L, 4169L, 4170L, 166L, 167L, 168L, 169L,
170L, 171L, 172L, 173L, 174L, 175L), class = "data.frame")

require(car)
foo <- function(x) {
  if (any(grepl(4, x))) {
    x <- recode(x, "2 = 1; 4 = 2")
  }
  return(x)
}

dat$respalt <- with(dat, ave(resp, factor(subject), FUN = foo))

## which at least for me gives:
structure(list(subject = c(8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L,
8L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 6L, 6L,
6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), resp = c(2, 1, 1, 2, 1, 2, 1,
1, 1, 1, 4, 4, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2,
1, 2), respalt = c(2, 1, 1, 2, 1, 2, 1, 1, 1, 1, 2, 2, 1, 1,
2, 2, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 2, 2, 1, 2)), .Names = c("subject",
"resp", "respalt"), row.names = c(1L, 2L, 3L, 4L, 5L, 6L, 7L,
8L, 9L, 10L, 4161L, 4162L, 4163L, 4164L, 4165L, 4166L, 4167L,
4168L, 4169L, 4170L, 166L, 167L, 168L, 169L, 170L, 171L, 172L,
173L, 174L, 175L), class = "data.frame")

Does that work for you?  I am running:

R Under development (unstable) (2011-07-30 r56564)
Platform: x86_64-pc-mingw32/x64 (64-bit)
with car_2.0-10

HTH,

Josh

On Mon, Aug 8, 2011 at 9:02 AM, Edward Patzelt <patze003 at umn.edu> wrote:
> Here's the code.  I don't want it to even touch the vector if there are
> already "1's & 2's"
>
> structure(list(subject = c(8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L, 8L,
> 8L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 42L, 6L, 6L,
> 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), resp = c(2, 1, 1, 2, 1, 2, 1,
> 1, 1, 1, 4, 4, 2, 2, 4, 4, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2,
> 1, 2)), .Names = c("subject", "resp"), row.names = c(1L, 2L,
> 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 4161L, 4162L, 4163L, 4164L,
> 4165L, 4166L, 4167L, 4168L, 4169L, 4170L, 166L, 167L, 168L, 169L,
> 170L, 171L, 172L, 173L, 174L, 175L), class = "data.frame")
>
> R version 2.12.2 (2011-02-25)
> Platform: x86_64-pc-mingw32/x64 (64-bit)
>
> locale:
> [1] LC_COLLATE=English_United States.1252  LC_CTYPE=English_United
> States.1252    LC_MONETARY=English_United States.1252
> [4] LC_NUMERIC=C                           LC_TIME=English_United
> States.1252
>
> attached base packages:
> [1] splines   stats     graphics  grDevices utils     datasets  methods
> base
>
> other attached packages:
> [1] car_2.0-10      nnet_7.3-1      MASS_7.3-11     Hmisc_3.8-3
> survival_2.36-5 RODBC_1.3-2
>
> loaded via a namespace (and not attached):
> [1] cluster_1.13.3  grid_2.12.2     lattice_0.19-17 tools_2.12.2
>
> On Mon, Aug 8, 2011 at 10:43 AM, Joshua Wiley <jwiley.psych at gmail.com>
> wrote:
>>
>> 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/
>
>
>
> --
> 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