On Jun 23, 2011, at 10:59 AM, Kara Przeczek wrote:
Dear R users,
I have run into a problem using if...else and I hope you can shed
some light on it. I am using R version 2.2.0.1.
I have the following data frame:
head(dat2f)
year tot_km3y
[1,] 1964 0.1876854
[2,] 1965 0.1835116
[3,] 1966 0.1915012
[4,] 1967 0.1869758
[5,] 1968 0.2249865
[6,] 1969 0.1916011
I need to pick out the median year, and since there are an even
number of data, I cannot use 'median' directly since it gives me a
non-existent year/discharge. I found a way to get around that with
the following:
md <- dat2f[, list(med_year = max(year[which(abs(tot_km3y -
median(tot_km3y)) == min(abs(tot_km3y - median(tot_km3y)))) ]),
med_TotQ = median(tot_km3y))]
(I really only need the year, not the actual discharge with that
year, which is why I left med_TotQ as the true median)
However, I have some data sets that have an odd number of data for
which the following works perfectly:
md <-dat2f[, list(med_year = year[which(tot_km3y ==
median(tot_km3y))], med_TotQ = median(tot_km3y))]
Thus, I would like to apply the above calculations depended on the
condition of:
length(dat2f$year)%%2==0
I put it all together as below:
if (length(dat2f$year)%%2==0) {
md <-dat2f[, list(med_year = max(year[which(abs(tot_km3y -
median(tot_km3y)) == min(abs(tot_km3y - median(tot_km3y)))) ]),
med_TotQ = median(tot_km3y))] }
else {
If this line is executed at a console session it will fail because the
interpreter does not keep a copy of the last condition. If you moved
the closing curley-brace to just befor the 'else', you should get the
behavior you expect (if your other code is correct):
Try instead:
if (length(dat2f$year)%%2==0) {
md <-dat2f[, list(med_year = max(year[which(abs(tot_km3y -
median(tot_km3y)) == min(abs(tot_km3y - median(tot_km3y)))) ]),
med_TotQ = median(tot_km3y))]
} else {
md <-dat2f[, list(med_year = year[which(tot_km3y ==
median(tot_km3y))], med_TotQ = median(tot_km3y))]
}
md <-dat2f[, list(med_year = year[which(tot_km3y ==
median(tot_km3y))], med_TotQ = median(tot_km3y))]
}
Each individual piece works perfectly on its own, but together I get
the following error:
if (length(dat2f$year)%%2==0) {
+ md <-dat2f[, list(med_year = max(year[which(abs(tot_km3y -
median(tot_km3y)) == min(abs(tot_km3y - median(tot_km3y)))) ]),
med_TotQ = median(tot_km3y))] }
else {
Error: unexpected 'else' in "else"
md <-dat2f[, list(med_year = year[which(tot_km3y ==
median(tot_km3y))], med_TotQ = median(tot_km3y))]
}
Error: unexpected '}' in " }"
When I tried to look up "else" I got this error:
?else
Error: unexpected 'else' in "?else"
Try instead:
?"else"
--
David
I have used exactly the same set up with if...else in other code and
it worked fine then. I tried to run it again, and I got the same
error as above. What is the problem? I hope it isn't something
simple and silly!
I realize that I can use the first line:
md <- dat2f[, list(med_year = max(year[which(abs(tot_km3y -
median(tot_km3y)) == min(abs(tot_km3y - median(tot_km3y)))) ]),
med_TotQ = median(tot_km3y))]
for all data sets and it will give me the median for both odd and
even-length data sets, but it is now about the principle; why won't
the if...else work?
Thank you very much for your time!
Kara
David Winsemius, MD
West Hartford, CT
______________________________________________
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.