Juan Carlos BorrĂ¡s
2011-Apr-07 13:56 UTC
[R] transform() on selective names. Is it possible?
Hi all,
I am whitening my data:
# code begins
N <- 300
M <- 2
x <- matrix(data=rnorm(N*M, 0, 3)-10, ncol=M, nrow=N)
y <- matrix(c(1,-2,-2,1), ncol=M, nrow=M)
z <- data.frame(x %*% y)
colnames(z) <- c('x','y')
par(mfrow=c(1,3))
plot(z, pch=5, col="blue")
whiten <- function(x) { (x-mean(x))/sd(x) }
zz <- transform(z, x=whiten(x), y=whiten(y))
plot(zz, pch=3, col="red")
#code ends
And everything looks fine enough.
But now I want to withen just one of the columns and I won't know
which one until my script is running, hence I can't hard code it in
the script.
Then I though, well maybe if I define some convenient f...
#begin code
f <- function(a) { paste(a,"=withen(",a,")",
sep='') }
a <- 'x' # or a <- 'y' depending on user input.....
f(a)> [1] "x=withen(x)"
# so I could try....
zzz <- transform(z, eval(f('x')))
# which of course doesn't work
plot(zz, pch=3, col="green")
head(z, n=2)> x y
>1 17.167380 6.884402
>2 8.234507 13.940932
head(zzz, n=2)> x y
>1 17.167380 6.884402
>2 8.234507 13.940932
#end code
Could someone provide me with some hint on whether the attempted trick
above is possible and how to proceed further?
Thanks in advance.
jcb!
On Apr 7, 2011, at 9:56 AM, Juan Carlos Borr?s wrote:> Hi all, > I am whitening my data: > > # code begins > N <- 300 > M <- 2 > x <- matrix(data=rnorm(N*M, 0, 3)-10, ncol=M, nrow=N) > y <- matrix(c(1,-2,-2,1), ncol=M, nrow=M) > z <- data.frame(x %*% y) > colnames(z) <- c('x','y') > par(mfrow=c(1,3)) > plot(z, pch=5, col="blue") > > whiten <- function(x) { (x-mean(x))/sd(x) }Consider: whiten <- scale # no need to re-invent the wheel fc <- function(dfrm, coln) transform(dfrm, coln=whiten(dfrm[coln])) colxy <- "x" z <- fc(z, colxy) # the "[" function will interpret colxy z> > zz <- transform(z, x=whiten(x), y=whiten(y)) > plot(zz, pch=3, col="red") > > #code ends > > And everything looks fine enough. > But now I want to withen just one of the columns and I won't know > which one until my script is running, hence I can't hard code it in > the script. > Then I though, well maybe if I define some convenient f... > > #begin code > > f <- function(a) { paste(a,"=withen(",a,")", sep='') } > a <- 'x' # or a <- 'y' depending on user input..... > f(a) >> [1] "x=withen(x)" > # so I could try.... > zzz <- transform(z, eval(f('x'))) > # which of course doesn't work > plot(zz, pch=3, col="green") > > head(z, n=2) >> x y >> 1 17.167380 6.884402 >> 2 8.234507 13.940932 > head(zzz, n=2) >> x y >> 1 17.167380 6.884402 >> 2 8.234507 13.940932 > > #end code > > Could someone provide me with some hint on whether the attempted trick > above is possible and how to proceed further? > Thanks in advance. > jcb! > > ______________________________________________ > R-help at r-project.org 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.David Winsemius, MD West Hartford, CT