[R] sas to r

Frank E Harrell Jr f.harrell at vanderbilt.edu
Sun Jul 18 00:09:47 CEST 2004


Here is an improvement to what I sent earlier today.

g <- function(y) {
   s <- apply(y, 2,
              function(z) {
                z <- z[!is.na(z)]
                n <- length(z)
                if(n==0) c(NA,NA,NA,0) else
                if(n==1) c(z, NA,NA,1) else {
                  m <- mean(z)
                  s <- sd(z)
                  c(Mean=m, CV=s/m, SE=s/sqrt(n), N=n)
                }
              })
   w <- as.vector(s)
   names(w) <-  as.vector(outer(rownames(s), colnames(s), paste, sep=''))
   w
}
library(Hmisc)
dat2 <-  with(dat1,
               summarize(cbind(BdA, sla),
                         llist(wshed, site, species),
                         g,
                         subset=species %in% c('b','c','p'),
                         stat.name=NULL)
               )

options(digits=3)
dat2  # is a data frame

    wshed site species MeanBdA CVBdA SEBdA NBdA Meansla  CVsla SEsla Nsla
1      1    A       b   100.5 0.133  4.23   10     195 0.1813 11.20   10
2      1    A       c    99.7 0.101  3.17   10     206 0.1024  6.68   10
3      1    A       p   101.4 0.239  7.65   10     188 0.1580  9.39   10
4      1    B       b   109.9 0.118  4.09   10     203 0.1433  9.21   10
5      1    B       c    98.4 0.193  6.01   10     221 0.1250  8.72   10
6      1    B       p   102.9 0.216  7.03   10     203 0.1446  9.29   10
7      2    A       b    95.8 0.241  7.31   10     195 0.2011 12.40   10
8      2    A       c    98.7 0.194  6.04   10     207 0.1274  8.33   10
9      2    A       p   102.2 0.217  7.01   10     191 0.1709 10.31   10
10     2    B       b    97.8 0.235  7.27   10     191 0.2079 12.58   10
11     2    B       c   100.9 0.164  5.24   10     194 0.0987  6.07   10
12     2    B       p   103.0 0.144  4.69   10     209 0.0769  5.35    9

# Another approach, but does casewise deletion of NAs and computes all
# possible marginal summaries
dat2 <- summary(cbind(BdA, sla) ~ wshed + site + species,
              data=dat1, fun=g, method='cross')
print.data.frame(dat2)  # after Sept 2004 just say dat2
# dat2 is similar to but not really a data frame, with a matrix of 
statistics S
# Remove method='cross' to just get all one-way summaries

-- 
Frank E Harrell Jr   Professor and Chair           School of Medicine
                      Department of Biostatistics   Vanderbilt University




More information about the R-help mailing list