# [R] aggregate

David L Carlson dcarlson at tamu.edu
Wed Aug 24 16:37:34 CEST 2016

```Thank you for the reproducible example, but it is not clear what cross product you want. Jim's solution gives you the cross product of the 2-column matrix with itself. If you want the cross product between the columns you need something else. The aggregate function will not work since it will treat the columns separately:

> A <- as.matrix(myData[myData\$Z=="A", 1:2])
> A
X Y
1 1 4
2 2 3
> crossprod(A) # Same as t(A) %*% A
X  Y
X  5 10
Y 10 25
> crossprod(A[, 1], A[, 2]) # Same as t(A[, 1] %*% A[, 2]
[,1]
[1,]   10
>
> # For all the groups
> lapply(split(myData, myData\$Z), function(x) crossprod(as.matrix(x[, 1:2])))
\$A
X  Y
X  5 10
Y 10 25

\$B
X  Y
X 25 10
Y 10  5

> lapply(split(myData, myData\$Z), function(x) crossprod(x[, 1], x[, 2]))
\$A
[,1]
[1,]   10

\$B
[,1]
[1,]   10

-------------------------------------
David L Carlson
Department of Anthropology
Texas A&M University
College Station, TX 77840-4352

-----Original Message-----
From: R-help [mailto:r-help-bounces at r-project.org] On Behalf Of Jim Lemon
Sent: Tuesday, August 23, 2016 6:02 PM
To: Gang Chen; r-help mailing list
Subject: Re: [R] aggregate

Hi Gang Chen,
If I have the right idea:

for(zval in levels(myData\$Z))
crossprod(as.matrix(myData[myData\$Z==zval,c("X","Y")]))

Jim

On Wed, Aug 24, 2016 at 8:03 AM, Gang Chen <gangchen6 at gmail.com> wrote:
> This is a simple question: With a dataframe like the following
>
> myData <- data.frame(X=c(1, 2, 3, 4), Y=c(4, 3, 2, 1), Z=c('A', 'A', 'B', 'B'))
>
> how can I get the cross product between X and Y for each level of
> factor Z? My difficulty is that I don't know how to deal with the fact
> that crossprod() acts on two variables in this case.
>
> ______________________________________________
> R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see
> https://stat.ethz.ch/mailman/listinfo/r-help