[R] Table and ftable

Peter Dalgaard P.Dalgaard at biostat.ku.dk
Tue Sep 4 11:41:53 CEST 2007


David Barron wrote:
> There might be simpler ways, but you can certainly do this with the
> reshape package, like this:
>
> library(reshape)
> dta <- read.table("clipboard",header=TRUE)
>
>   sic level area
> 1   a   211  2.4
> 2   b   311  2.3
> 3   b   322  0.2
> 4   b   322  0.5
> 5   c   100  3.0
> 6   c   100  1.5
> 7   c   242  1.5
> 8   d   222  0.2
>   
>
> mlt.dta <- melt(dta)
> cst.dta <- cast(mlt.dta,sic~level,sum)
>
>   sic 100 211 222 242 311 322
> 1   a  NA 2.4  NA  NA  NA  NA
> 2   b  NA  NA  NA  NA 2.3 0.7
> 3   c 4.5  NA  NA 1.5  NA  NA
> 4   d  NA  NA 0.2  NA  NA  NA
>
> Then just replace the NAs with 0s.
>
>   
tapply() will do this too:

> with(d,tapply(area,list(sic,level), sum))
  100 211 222 242 311 322
a  NA 2.4  NA  NA  NA  NA
b  NA  NA  NA  NA 2.3 0.7
c 4.5  NA  NA 1.5  NA  NA
d  NA  NA 0.2  NA  NA  NA

This has the same awkwardness of giving NA for empty cells, and there is
no easy way to circumvent it since the FUN of tapply is simply not
called for such  cells.
Replacing NA by zero is a bit dangerous (albeit not in the present case)
since you can get an NA cell for more than one reason. A more careful
approach is like this:

> with(d,{t1 <- tapply(area,list(sic,level), sum)
          t2 <- table(sic,level)
          t1[t2==0] <- 0
          t1} )
  100 211 222 242 311 322
a 0.0 2.4 0.0 0.0 0.0 0.0
b 0.0 0.0 0.0 0.0 2.3 0.7
c 4.5 0.0 0.0 1.5 0.0 0.0
d 0.0 0.0 0.2 0.0 0.0 0.0
>       

> HTH.
>
> David Barron
> On 9/4/07, Giulia Bennati <bennati at gmail.com> wrote:
>   
>> Dear listmembers,
>> I have a little question: I have my data organized as follow
>>
>> sic  level  area
>> a    211    2.4
>> b    311    2.3
>> b    322    0.2
>> b    322    0.5
>> c    100    3.0
>> c    100    1.5
>> c    242    1.5
>> d    222    0.2
>>
>> where levels and sics are factors. I'm trying to obtain a matrix like this:
>>
>>         level
>>          211    311    322   100    242     222
>> sic
>> a        2.4      0       0       0       0        0
>> b         0       2.3    0.7     0       0        0
>> c         0        0      0       4.5     1.5     0
>> d         0        0      0        0       0       0.2
>>
>> I tryed with table function as
>> table(sic,level) but i obteined only a contingency table.
>> Have you any suggestions?
>> Thank you very much,
>> Giulia
>>
>> ______________________________________________
>> R-help at stat.math.ethz.ch 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.
>>
>>     
>
>
>   


-- 
   O__  ---- Peter Dalgaard             Øster Farimagsgade 5, Entr.B
  c/ /'_ --- Dept. of Biostatistics     PO Box 2099, 1014 Cph. K
 (*) \(*) -- University of Copenhagen   Denmark          Ph:  (+45) 35327918
~~~~~~~~~~ - (p.dalgaard at biostat.ku.dk)                  FAX: (+45) 35327907



More information about the R-help mailing list