[R] nested ifelse problem
Duncan Murdoch
murdoch.duncan at gmail.com
Thu Feb 10 02:26:13 CET 2011
On 11-02-09 3:47 PM, eck 1 wrote:
>
> Hello R-Help users,
>
> I have a data frame named fd, a sample of which looks like this:
>
>
>
>
>
> cbi_A
>
> cbi_B
>
> cbi_B1
>
> cbi_B2
>
> cbi_C
>
> cbi_D
>
> cbi_E
>
> cbi_F
>
>
> 2.183451
>
> 1.047546
>
> NA
>
> NA
>
> NA
>
> NA
>
> 0.428528
>
> NA
>
>
> 0.795837
>
> 0.510152
>
> 0.510152
>
> NA
>
> NA
>
> NA
>
> NA
>
> NA
>
>
> 0.795837
>
> 1.149577
>
> 0.843485
>
> 1.122334
>
> NA
>
> NA
>
> NA
>
> NA
>
>
> 1.885522
>
> 2.203959
>
> NA
>
> NA
>
> 3.020202
>
> 3.040506
>
> 0.428528
>
> 0.224467
>
>
> 2.877257
>
> 1.353637
>
> NA
>
> NA
>
> 3.020202
>
> NA
>
> 0.836649
>
> NA
>
>
> 1.479441
>
> 2.816141
>
> NA
>
> NA
>
> 3.020202
>
> NA
>
> 3.040506
>
> 3.040506
>
>
> 1.836547
>
> 1.659729
>
> 1.203959
>
> 2.401184
>
> 3.020202
>
> NA
>
> NA
>
> NA
>
>
> 2.069177
>
> 1.870625
>
> 1.768595
>
> 2.989593
>
> NA
>
> NA
>
> NA
>
> NA
>
>
> 2.046985
>
> 1.203959
>
> 1.203959
>
> NA
>
> NA
>
> NA
>
> NA
>
> NA
>
>
> 1.469238
>
> NA
>
> 1.278849
>
> NA
>
> NA
>
> NA
>
> NA
>
> NA
>
>
>
>
>
>
>
>
>
> I want to create a new column (fd$cbi_tot) that is an average of some of the other columns (chosen based on the conditions as indicated in the code below).
>
> ifelse(is.na(fd$cbi_C)& is.na(fd$cbi_D)& is.na(fd$cbi_E)& is.na(fd$cbi_F)& is.na(fd$cbi_B1)& !is.na(fd$cbi_B2),
> cbi_totlist<- cbind(fd$cbi_A, fd$cbi_B2),
You seem to be mixing up ifelse() with if ( ) else . You don't normally
do an assignment within one of the ifelse() values, you do things like this:
x <- 1:10
labels <- ifelse( x < 5, "low", "high")
Both "low" and "high" are evaluated and converted to vectors the same
length as the result of "x < 5" (i.e. 10 in my example), then elements
where x < 5 take the value from "low", and elements where that is not
true take the value from "high".
Duncan Murdoch
> ifelse(is.na(fd$cbi_C)& is.na(fd$cbi_D)& is.na(fd$cbi_E)& is.na(fd$cbi_F)& is.na(fd$cbi_B2)& !is.na(fd$cbi_B1),
> cbi_totlist<- cbind(fd$cbi_A, fd$cbi_B1),
> ifelse(is.na(fd$cbi_C)& is.na(fd$cbi_D)& is.na(fd$cbi_E)& is.na(fd$cbi_F)& !is.na(fd$cbi_B1)& !is.na(fd$cbi_B2),
> cbi_totlist<- cbind(fd$cbi_A, fd$cbi_B1, fd$cbi_B2),
> cbi_totlist<- cbind(fd$cbi_A, fd$cbi_B, fd$cbi_C, fd$cbi_D, fd$cbi_E, fd$cbi_F))))
>
> fd$cbi_tot<- apply(cbi_totlist, 1, mean, na.rm = TRUE)
>
> I do not get an error and the new column (fd$cbi_tot) is created, but when I check the results, the first condition works properly, as does the last (the catch-all), but the middle two conditions seem to default to the catch-all. For example, in my data, look at row 3, where fd$cbi_C, fd$cbi_D, fd$cbi_E and fd$cbi_F are all NA, and fd$cbi_B1 and fd$cbi_B2 have values. In this case, R uses the cbi_totlist that includes fd$cbi_B, whereas I would like it to use the list that includes fd$cbi_B1 and fd$cbi_B2 (and I thought I indicated that in the conditional statements). Anybody have ideas about what I am doing wrong here?
>
> Thanks much for any suggestions!
>
>
> [[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.
More information about the R-help
mailing list