Skip to content
Prev 333184 / 398506 Next

getting the results of tapply into a single matrix

Hi,
Try:
example <- read.table(text="ID Sex Location CL
1?? F??? lake1?? 40
1?? F??? lake1??? 
1?? F??? lake1???? 43
2?? M??? lake1??? 30
3?? M??? lake2??? 22
4?? F??? lake2???? 25
4?? F??? lake2???? 27",sep="",header=TRUE,stringsAsFactors=FALSE,fill=TRUE) 


aggregate(CL~.,example,mean,na.rm=TRUE)

#or
library(plyr)
ddply(example,.(ID,Sex,Location),summarize,CL=mean(CL,na.rm=TRUE))


#or from `result`
?res <- setNames(cbind(expand.grid(dimnames(result),stringsAsFactors=FALSE),as.data.frame(as.matrix(result))),c("Location","Sex","ID","CL"))
?res[!is.na(res$CL),c(3,2,1,4)]

###It would be better to store the results in a data.frame than in a matrix for this case.

A.K.



I have a table with three categorical columns (ID, Sex, Location) and a 
measurement column (CL). These are measurements from individuals in a 
study. Some individuals were measured more than once and thus have 
multiple rows. For those individuals, I need to take an average of all 
of their measurements so that I can run statistical tests without having pseudoreplication. Below is an example table with the code that I am 
using, the results that I am getting, and the results that I want (I am 
calling the table "example"). 
? 
ID Sex Location CL 
1 ? F ? ?lake1 ? ? 40 
1 ? F ? ?lake1 ? ? 
1 ? F ? ?lake1 ? ? 43 
2 ? M ? ?lake1 ? ?30 
3 ? M ? ?lake2 ? ?22 
4 ? F ? ?lake2 ? ? 25 
4 ? F ? ?lake2 ? ? 27
this almost does what I want. I takes the mean for each ID, and 
retains its relationship to the categorical variables, the problem is 
the output looks like this: 

, , 1 

? ? ? ? ? ? ?F M 
lake1 41.66667 ? 
lake2 ? ? ? ? ? 

, , 2 

? ? ? F ? ? ? ?M 
lake1 ? 30.00000 
lake2 ? ? ? ? ? 

, , 3 

? ? ? F ? ? ? ?M 
lake1 ? ? ? ? ? 
lake2 ? 22.00000 

, , 4 

? ? ? ? ? ? ?F M 
lake1 ? ? ? ? ? 
lake2 26.00000 ? 

How do I get those results back into a single table like I 
originally had. In other words, I want a table that looks like this: ? 

ID Sex Location CL 
1 ? F ? ?lake1 ? ? 41.66667 
2 ? M ? ?lake1 ? ?30 
3 ? M ? ?lake2 ? ?22 
4 ? F ? ?lake2 ? ? 26.00000 
? 

Thanks for the help!