The problem is that the 2nd column in your data frame has been converted into a factor. This happened because you used cbind() with mixed character and numeric vectors. cbind() with these types of arguments will construct a character matrix. Then when you passed that character matrix to as.data.frame() it converted both columns to factors.

Here's a simpler example of what happened:

> cbind(letters[1:2], c(1,3))
     [,1] [,2]
[1,] "a"  "1"
[2,] "b"  "3"
> x <- as.data.frame(cbind(letters[1:2], c(1,3)))
> x
  V1 V2
1  a  1
2  b  3
> as.numeric(x[,2])
[1] 1 2
> as.numeric(as.character(x[,2]))
[1] 1 3
>

With the data frame as you constructed it, you need an expression like round(as.numeric(as.character(Np.occup97.98[,2])), 2) to accomplish what you want. It would probably be better to construct a more felicitous data frame in the first place:

> df <- data.frame(site = levels(sums$site), Np.occup97.98 = sums$Ant.Nptrad97.98/Ant.trad$Ant.trad97.98)

(unless of course you had some unstated reason for constructing the data frame the way you did)

-- Tony Plate

At Thursday 10:03 AM 7/31/2003 +0200, Tord Snall wrote:
Dear all,

I have divided two vectors:

Np.occup97.98<- as.data.frame(cbind(site = levels(sums$site),
         Np.occup97.98 = sums$Ant.Nptrad97.98/Ant.trad$Ant.trad97.98))

> Np.occup97.98
      site     Np.occup97.98
1  erken97 0.342592592592593
2  erken98 0.333333333333333
3 rormyran  0.48471615720524
4  valkror 0.286026200873362

However, at a later stage of the analysis I want
> round(Np.occup97.98[,2], 2)
Error in Math.factor(x, digits) : "round" not meaningful for factors

neither did this work:

> round(Np.occup97.98[,2], 2)
Error in Math.factor(x, digits) : "round" not meaningful for factors

or this:

> round(as.numeric(Np.occup97.98[,2]), 2)
[1] 3 2 4 1
>

because, as clearly written in the help file:
"as.numeric for factors yields the codes underlying the factor levels, not
the numeric representation of the labels."

I've discovered this solution:

> Np.occup97.98<- as.data.frame(cbind(site = levels(sums$site),
+          Np.occup97.98 =
round(sums$Ant.Nptrad97.98/Ant.trad$Ant.trad97.98,2)))
>
> Np.occup97.98
      site Np.occup97.98
1  erken97          0.34
2  erken98          0.33
3 rormyran          0.48
4  valkror          0.29


However, I would like to do this rounding later.


Could someone give a tip. I think that I would have been helped by a
sentence in help(as.numeric).


Thanks in advance.



Sincerely, Tord




----------------------------------------------------------------------- Tord Snäll Avd. f växtekologi, Evolutionsbiologiskt centrum, Uppsala universitet Dept. of Plant Ecology, Evolutionary Biology Centre, Uppsala University Villavägen 14 SE-752 36 Uppsala, Sweden Tel: 018-471 28 82 (int +46 18 471 28 82) (work) Tel: 018-25 71 33 (int +46 18 25 71 33) (home) Fax: 018-55 34 19 (int +46 18 55 34 19) (work) E-mail: [EMAIL PROTECTED] Check this: http://www.vaxtbio.uu.se/resfold/snall.htm!

______________________________________________
[EMAIL PROTECTED] mailing list
https://www.stat.math.ethz.ch/mailman/listinfo/r-help

______________________________________________ [EMAIL PROTECTED] mailing list https://www.stat.math.ethz.ch/mailman/listinfo/r-help

Reply via email to