[19160] in s-news-athena

home help back first fref pref prev next nref lref last post

[S] Question on data manipulation

daemon@ATHENA.MIT.EDU (Abd Rahman Kassim)
Wed Sep 8 23:57:48 1999

Message-Id: <01BEFAB9.B51E2CE0.rahmank@frim.gov.my>
From: Abd Rahman Kassim <rahmank@frim.gov.my>
To: "s-news@wubios.wustl.edu" <s-news@wubios.wustl.edu>
Date: Thu, 9 Sep 1999 11:51:51 +0800


Dear S-Plus user,

Thanks to the prompt responses by Dr. Bill Dunlap, Dr. Scott Saleska, Prof. 
Brian D. Ripley and  Dr. S.H. Heisterkamp and  Dr. Gerald Jean. The 
solution is not so simple as I thought. Need further learning and 
understand of the right code to use. The question and solution is shown 
below. I have tried the first three solutions and it work well with my data 
set. Preferred solution for my actual research data set is by Bill Dunlap.

Thanks again for all your kind assistance.

Abd Rahman
Hill Forest Silviculture
FRIM


QUESTION

My question is on how to write S-plus code to calculate the value of
>  "relative position"  for a particular subject of that variable. For
> example,
>
> Data file: tree.dat
> Variables : Plot : Size of the plot
>                  DBH : Diameter of the subject tree
>                  DBHL: Total diameter of trees for trees larger than
> the
> subject tree
>
> Plot      DBH        DBHL
> ------    ------------    ---------
> a            10           40
> a            15            0
> a            13           15
> a            12           28
> b             5            30
> b            10           13
> b             7            23
> b             13           0
>
> In this example, my question is how to write S-plus code, to calculate
> the
> value of DBHL.
> I am using S-plus for Windows Version 4.5 Rel. 2.

================
SOLUTION given by the respective adviser.

Bill Dunlap wrote;

f<-function(data)
{
        i <- order(data$Plot,  - data$DBH)
        data$DBHL <- data$DBH
        data$DBHL[i] <- unlist(lapply(split(data$DBH[i], data$Plot[i]), 
cumsum)
                ) - data$DBH[i]
        data
}

E.g., with a data frame d:
> f(d)

++++++++++++++++++
Dr. Scott Saleska wrote;

	attach(tree.dat)

	DBHL<-tapply( tree.dat$DBH, tree.dat$Plot, function(x)
    	   {
		y <- rep(0, length(x))
		for( i in 1:length(x) ) y[i] <- sum( x[x>x[i]] )
		y }
		 )
	DBHL

	data.frame ( tree.dat, DBHL=c(DBHL$a, DBHL$b) )

+++++++++++++++
Bill Venables wrote:

lg <- function(x)
{
  ind <- rev(order(x))
  y <- cumsum(x[ind])
  y <- c(0, y[-length(y)])
  x[ind] <- y
  x
}
> lg(c(10, 15, 13, 12))
[1] 40  0 15 28

This does not handle ties, but is faster for large groups.

+++++++++++++++
Dr. S.H. Heisterkamp wrote;

tree.dat$DBHL<-NULL
which.plots<-unique(tree.dat$plot)
for (pl in wich.plots){
dbh.plot<-tree.dat[tree.dat$plot==pl,2]
for (i in 1:length(dbh.plot)){
tree.dat$DBHL<c(tree.dat$DBHL,sum(dbh.plot[-i]))
}
}

+++++++++++++++++++++
Gerald Jean wrote;

"testsum" <- function (ttt.frame)
{
  ttt.split <- lapply(split(ttt.frame$DBH, ttt.frame$Plot), FUN =
function(x)
    {my.mat <- as.matrix(x)
     apply(my.mat, 1, FUN = function(x,y)
   {sum(y[y > x])}, my.mat)})
  DBHL <- rep(0,nrow(ttt.frame))
  start <- 1
  for (i in 1:length(ttt.split))
    {end <- start + length(ttt.split[[i]]) - 1
     DBHL[start:end] <- ttt.split[[i]]
     start <- end + 1
    }
  DBHL
}

Testing the function:

> ttt.frame
> ttt.frame$DBHL_testsum(ttt.frame)
> ttt.frame



-----------------------------------------------------------------------
This message was distributed by s-news@wubios.wustl.edu.  To unsubscribe
send e-mail to s-news-request@wubios.wustl.edu with the BODY of the
message:  unsubscribe s-news

home help back first fref pref prev next nref lref last post