[R] Trying to understand a function passed to lapply
William Dunlap
wdunlap at tibco.com
Tue Mar 31 04:52:19 CEST 2015
> I can't understand how the body of the function, x[c1]/x[c2] refers to
the columns "data" and "SE" of the matrix data.
If you put the line 'str(x)' at the start of myfun(), as in
myfun <- function(x, c1, c2) {
str(x)
x[c1]/x[c2]
}
you would start to see why it works - extracting a row from a matrix gives
you a vector with names copied from the column names of the matrix.
Thus subscripting with a single name (or number) works.
> apply(data,1,myfun,c1="delta",c2="SE")
Named num [1:8] -0.7 -0.9 -0.5 20 20 ...
- attr(*, "names")= chr [1:8] "delta" "low" "high" "n1" ...
Named num [1:8] -0.3 -0.43 -0.17 43 43 ...
- attr(*, "names")= chr [1:8] "delta" "low" "high" "n1" ...
Named num [1:8] -0.5 -1.05 0.05 16 18 ...
...
Named num [1:8] -0.3 -0.83 0.23 27 27 ...
- attr(*, "names")= chr [1:8] "delta" "low" "high" "n1" ...
[1] -13.720000 -9.046154 -3.563636 0.000000 -28.311111 -32.072727
-2.903704 -2.218868
By the way, that call to apply is just a slow way of dividing two columns
of the matrix
> data[, "delta"]/data[, "SE"]
[1] -13.720000 -9.046154 -3.563636 0.000000 -28.311111 -32.072727
-2.903704 -2.218868
Bill Dunlap
TIBCO Software
wdunlap tibco.com
On Mon, Mar 30, 2015 at 6:48 PM, John Sorkin <jsorkin at grecc.umaryland.edu>
wrote:
> Colleagues,
> I am trying to understand the syntax of a function passed to apply. The
> code below generates a matrix, and passes the matrix to a function that is
> called by apply. I don't understand the syntax of the function. In some way
> the function computes data[,"delta"]/data[,"SE"]. I can't understand how
> the body of the function, x[c1]/x[c2] refers to the columns "data" and "SE"
> of the matrix data. Can someone help me understand the syntax?
> Thank you,
> John
>
> myfun <- function(x, c1, c2) x[c1]/x[c2]
> apply(data,1,myfun,c1="delta",c2="SE")
>
> CODE:
>
> data<-matrix(data=c(-0.70 ,-0.90, -0.50, 20, 20,
> -0.30 ,-0.43, -0.17, 43, 43,
> -0.50 ,-1.05, 0.05, 16, 18,
> 0.00 ,-0.21, 0.21, 22, 23,
> -1.30 ,-1.48, -1.12, 28, 32,
> -0.90 ,-1.01, -0.79, 18, 15,
> -0.20 ,-0.47, 0.07, 39, 39,
> -0.30 ,-0.83, 0.23, 27, 27),
> nrow=8,ncol=5,byrow=TRUE)
> dimnames(data) <- list(NULL,c("delta","low","high","n1","n2"))
> data
> CI <- data[,"high"]-data[,"low"]
> data <- cbind(data,CI)
> data
> data <- cbind(data,SE=data[,"CI"]/(4*1.96))
> data
> data <- cbind(data,SD=data[,"SE"]*sqrt(data[,"n1"]+data[,"n2"]))
> data
> myfun <- function(x, c1, c2) x[c1]/x[c2]
> apply(data,1,myfun,c1="delta",c2="SE")
>
> John David Sorkin M.D., Ph.D.
> Professor of Medicine
> Chief, Biostatistics and Informatics
> University of Maryland School of Medicine Division of Gerontology and
> Geriatric Medicine
> Baltimore VA Medical Center
> 10 North Greene Street
> GRECC (BT/18/GR)
> Baltimore, MD 21201-1524
> (Phone) 410-605-7119
> (Fax) 410-605-7913 (Please call phone number above prior to faxing)
>
> Confidentiality Statement:
> This email message, including any attachments, is for ...{{dropped:16}}
More information about the R-help
mailing list