[R] convert a character string to a name

2 views
Skip to first unread message

jpm miao

unread,
May 23, 2013, 3:05:19 AM5/23/13
to r-help
Hi,
From time to time I need to do the aggregation. To illustrate, I present
a toy example as below. In this example, the task is to aggregate x and y
by z with the function mean.
Could I call the aggregation function with x_test, where
x_test=c("x","y")? Thanks

Miao


> dftest<-data.frame(x=1:12, y=(1:12)%%4, z=(1:12)%%2)
> dftest
x y z
1 1 1 1
2 2 2 0
3 3 3 1
4 4 0 0
5 5 1 1
6 6 2 0
7 7 3 1
8 8 0 0
9 9 1 1
10 10 2 0
11 11 3 1
12 12 0 0
> aggregate(cbind(x,y)~z, data=dftest, FUN=mean)
z x y
1 0 7 1
2 1 6 2
> x_test=c("x","y")
> aggregate(cbind(x_test)~z, data=dftest, FUN=mean)
Error in model.frame.default(formula = cbind(x_test) ~ z, data = dftest) :
variable lengths differ (found for 'z')
a1aggregate(cbind(factor(x_test))~z, data=dftest, FUN=mean)
Error in model.frame.default(formula = cbind(factor(x_test)) ~ z, data =
dftest) :
variable lengths differ (found for 'z')
> aggregate(factor(x_test)~z, data=dftest, FUN=mean)
Error in model.frame.default(formula = factor(x_test) ~ z, data = dftest) :
variable lengths differ (found for 'z')

[[alternative HTML version deleted]]

______________________________________________
R-h...@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.

arun

unread,
May 23, 2013, 3:19:06 AM5/23/13
to jpm miao, R help
 with(dftest,aggregate(cbind(x,y),list(z),FUN=mean))
#  Group.1 x y
#1       0 7 1
#2       1 6 2


#or
library(plyr)
ddply(dftest,.(z),numcolwise(mean))
#  z x y
#1 0 7 1
#2 1 6 2
A.K.

Blaser Nello

unread,
May 23, 2013, 3:29:49 AM5/23/13
to arun, jpm miao, R help
If you want to use the character string:

attach(dftest)
aggregate(cbind(sapply(x_test, get))~z, data=dftest, FUN=mean)
# or
with(dftest,aggregate(cbind(sapply(x_test, get)),list(z),FUN=mean))
detach(dftest)

Cheers,
Nello

jim holtman

unread,
May 23, 2013, 3:45:04 AM5/23/13
to jpm miao, r-help
try this:

> dftest<-data.frame(x=1:12, y=(1:12)%%4, z=(1:12)%%2)
> aggregate(cbind(x,y)~z, data=dftest, FUN=mean)
z x y
1 0 7 1
2 1 6 2
> x_test=c("x","y")
> a <- formula(paste0('cbind('
+ , x_test[1]
+ , ','
+ , x_test[2]
+ , ') ~ z'
+ ))
> a
cbind(x, y) ~ z
> aggregate(a, data = dftest, FUN = mean)
--
Jim Holtman
Data Munger Guru

What is the problem that you are trying to solve?
Tell me what you want to do, not how you want to do it.

arun

unread,
May 23, 2013, 3:49:21 AM5/23/13
to jpm miao, R help
Sorry, didn't read your question properly

#Just a modification without attach():
 aggregate(cbind(sapply(x_test,get,dftest))~z,data=dftest,FUN=mean)
#  z x y
#1 0 7 1
#2 1 6 2

#if you need to aggregate() all the columns except the grouping column

 aggregate(.~z,data=dftest,FUN=mean)

Greg Snow

unread,
May 23, 2013, 10:07:28 AM5/23/13
to jpm miao, r-help
Here are a couple of approaches:

> dftest<-data.frame(x=1:12, y=(1:12)%%4, z=(1:12)%%2)
> x_test=c("x","y")
> aggregate( dftest[,x_test], dftest['z'], FUN=mean )
z x y
1 0 7 1
2 1 6 2
>
> ### Or
>
> tmp.f <- as.formula( paste( 'cbind(',
+ paste( x_test, collapse=',' ),
+ ') ~ z' ) )
> aggregate( tmp.f, data=dftest, FUN=mean )
z x y
1 0 7 1
2 1 6 2


The first just uses x_test to subset the data frame and sends the
constructed subset to aggregate. The second constructs the formula from
the strings and passes the formula to aggregate.
--
Gregory (Greg) L. Snow Ph.D.
538...@gmail.com
Reply all
Reply to author
Forward
0 new messages