Re: [R] ifelse() and missing values in test conditions

2010-07-20 Thread Hosack, Michael
Josh,

Thank you for your help. The latter method does exactly what I want in one line 
of code per variable. 
Also, fyi, I just came across another method that uses %in% in place of == when 
NA's are present in 
the test condition variable data and it too works. So my new code is now:


PBTCHE$ANYEF <- with(PBTCHE, ifelse(PSOUGHT1 %in% 'ANY' | PSOUGHT2 %in% 'ANY' | 
PSOUGHT3 %in% 'ANY', PEFF, 0))


Mike 


http://stackoverflow.com/questions/2553108/replace-values-in-a-dataframe-based-on-another-factor-which-contains-nas-in-r


-Original Message-
From: Joshua Wiley [mailto:jwiley.ps...@gmail.com] 
Sent: Tuesday, July 20, 2010 1:41 PM
To: Hosack, Michael
Cc: r-help@r-project.org
Subject: Re: [R] ifelse() and missing values in test conditions

Hi Mike,

Probably the simplest way from what you have done would be to just set
any NA values in the column to 0:

DF$ANYEF[is.na(DF$ANYEF)] <- 0

Alternately, you can try this.  It should work, but it is far from elegant.

DF$ANYEF <- with(DF, ifelse(
 rowSums(cbind(PSOUGHT1, PSOUGHT2, PSOUGHT3) == "ANY", na.rm = TRUE) >=1,
 PEFF, 0))

Best regards,

Josh

On Tue, Jul 20, 2010 at 9:41 AM, Hosack, Michael  wrote:
> R experts,
>
> I have been unable to get the following ifelse statement to work as desired 
> when applied
> to my data frame.
>
> Example:
>
> DF$ANYEF <- 
> with(DF,ifelse(PSOUGHT1=='ANY'|PSOUGHT2=='ANY'|PSOUGHT3=='ANY',PEFF,0))
>
> # this statement will be replicated 16 times for 16 unique _EF variables 
> ###
>
> Basically, I want each ANYEF for each row to equal the corresponding row 
> value for column
> PEFF if 'ANY' occurs at least once among columns PSOUGHT1, PSOUGHT2, and 
> PSOUGHT3, and I want
> ANYEF to equal 0 if 'ANY' is not present within either PSOUGHT1 or PSOUGHT2 
> or PSOUGHT3. My
> ifelse statement will yield NAs rather than zeroes as desired whenever 'ANY' 
> is not present
> and NAs are included in at least one of the PSOUGHT variables. This data 
> frame is a small subset
> of a larger data frame.
>
> Thank you,
>
> Mike
>
>
> DF <-
> structure(list(SITE = c("EAST.AVE", "LAMPE", "LAMPE", "EAST.AVE",
> "EAST.AVE"), MM = c(5L, 5L, 5L, 9L, 9L), DD = c(19L, 23L, 23L,
> 13L, 13L), PEFF = c(11.25, 9, 8, 1.5, 8), PSOUGHT1 = c("ANY",
> "SMB", "SMB", "YP", "ANY"), PSOUGHT2 = c("LMB", NA, NA, NA, NA
> ), PSOUGHT3 = c(NA, NA, NA, NA, NA), ANYEF = c(11.25, NA, NA,
> NA, 8)), .Names = c("SITE", "MM", "DD", "PEFF", "PSOUGHT1", "PSOUGHT2",
> "PSOUGHT3", "ANYEF"), class = "data.frame", row.names = c(24L,
> 38L, 39L, 471L, 472L))
>
> __
> 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.
>



-- 
Joshua Wiley
Ph.D. Student, Health Psychology
University of California, Los Angeles
http://www.joshuawiley.com/
__
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.


Re: [R] ifelse() and missing values in test conditions

2010-07-20 Thread Joshua Wiley
Hi Mike,

Probably the simplest way from what you have done would be to just set
any NA values in the column to 0:

DF$ANYEF[is.na(DF$ANYEF)] <- 0

Alternately, you can try this.  It should work, but it is far from elegant.

DF$ANYEF <- with(DF, ifelse(
 rowSums(cbind(PSOUGHT1, PSOUGHT2, PSOUGHT3) == "ANY", na.rm = TRUE) >=1,
 PEFF, 0))

Best regards,

Josh

On Tue, Jul 20, 2010 at 9:41 AM, Hosack, Michael  wrote:
> R experts,
>
> I have been unable to get the following ifelse statement to work as desired 
> when applied
> to my data frame.
>
> Example:
>
> DF$ANYEF <- 
> with(DF,ifelse(PSOUGHT1=='ANY'|PSOUGHT2=='ANY'|PSOUGHT3=='ANY',PEFF,0))
>
> # this statement will be replicated 16 times for 16 unique _EF variables 
> ###
>
> Basically, I want each ANYEF for each row to equal the corresponding row 
> value for column
> PEFF if 'ANY' occurs at least once among columns PSOUGHT1, PSOUGHT2, and 
> PSOUGHT3, and I want
> ANYEF to equal 0 if 'ANY' is not present within either PSOUGHT1 or PSOUGHT2 
> or PSOUGHT3. My
> ifelse statement will yield NAs rather than zeroes as desired whenever 'ANY' 
> is not present
> and NAs are included in at least one of the PSOUGHT variables. This data 
> frame is a small subset
> of a larger data frame.
>
> Thank you,
>
> Mike
>
>
> DF <-
> structure(list(SITE = c("EAST.AVE", "LAMPE", "LAMPE", "EAST.AVE",
> "EAST.AVE"), MM = c(5L, 5L, 5L, 9L, 9L), DD = c(19L, 23L, 23L,
> 13L, 13L), PEFF = c(11.25, 9, 8, 1.5, 8), PSOUGHT1 = c("ANY",
> "SMB", "SMB", "YP", "ANY"), PSOUGHT2 = c("LMB", NA, NA, NA, NA
> ), PSOUGHT3 = c(NA, NA, NA, NA, NA), ANYEF = c(11.25, NA, NA,
> NA, 8)), .Names = c("SITE", "MM", "DD", "PEFF", "PSOUGHT1", "PSOUGHT2",
> "PSOUGHT3", "ANYEF"), class = "data.frame", row.names = c(24L,
> 38L, 39L, 471L, 472L))
>
> __
> 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.
>



-- 
Joshua Wiley
Ph.D. Student, Health Psychology
University of California, Los Angeles
http://www.joshuawiley.com/

__
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.


[R] ifelse() and missing values in test conditions

2010-07-20 Thread Hosack, Michael
R experts,

I have been unable to get the following ifelse statement to work as desired 
when applied 
to my data frame.

Example:

DF$ANYEF <- 
with(DF,ifelse(PSOUGHT1=='ANY'|PSOUGHT2=='ANY'|PSOUGHT3=='ANY',PEFF,0))
  
# this statement will be replicated 16 times for 16 unique _EF variables ###

Basically, I want each ANYEF for each row to equal the corresponding row value 
for column 
PEFF if 'ANY' occurs at least once among columns PSOUGHT1, PSOUGHT2, and 
PSOUGHT3, and I want 
ANYEF to equal 0 if 'ANY' is not present within either PSOUGHT1 or PSOUGHT2 or 
PSOUGHT3. My 
ifelse statement will yield NAs rather than zeroes as desired whenever 'ANY' is 
not present 
and NAs are included in at least one of the PSOUGHT variables. This data frame 
is a small subset 
of a larger data frame.

Thank you,

Mike


DF <-
structure(list(SITE = c("EAST.AVE", "LAMPE", "LAMPE", "EAST.AVE", 
"EAST.AVE"), MM = c(5L, 5L, 5L, 9L, 9L), DD = c(19L, 23L, 23L, 
13L, 13L), PEFF = c(11.25, 9, 8, 1.5, 8), PSOUGHT1 = c("ANY", 
"SMB", "SMB", "YP", "ANY"), PSOUGHT2 = c("LMB", NA, NA, NA, NA
), PSOUGHT3 = c(NA, NA, NA, NA, NA), ANYEF = c(11.25, NA, NA, 
NA, 8)), .Names = c("SITE", "MM", "DD", "PEFF", "PSOUGHT1", "PSOUGHT2", 
"PSOUGHT3", "ANYEF"), class = "data.frame", row.names = c(24L, 
38L, 39L, 471L, 472L))

__
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.