Hi > > > Hi > > > > > > > > Hello, > > > > > > I know that it'll be quite easy to do what I want but somehow I am lost > > as > > > I am new to R. I want to get summary results arranged by groups. In > > detail > > > I'd like get the number (levels) of Species per Family like for this
> > dataset: > > > > > > SPEC <- factor(c("a","a","b","b","c","c","c","d","e","e","e","e")) > > > FAM <- factor(c("A","A","A","A","B","B","B","C","C","C","C","C")) > > > df <- data.frame(SPEC,FAM) > > > > > > I tried tapply(SPEC, FAM, nlevels).. but it is not the result I am > > looking for... > > > > > > What is the easiest way to do that? Do I have to rearrange the dataset? > > > > To do what? Do you want number of unique entries within each level of FAM? > > If yes > > > > sapply(tapply(SPEC, FAM, unique), length) > > > > can do this. > > > > Regards > > Petr > > Thank you Petr, > > that is exactly what I was looking for... no I played a little bit around > with that because I want to create a summary with FAM as a grouping > variable. Beside the number of unique SPEC per FAM also want to get their > levels as text. So far I know I have following: > > paste(unique(SPEC), collapse = ', ') > > But how can I use that in combination with tapply and furthermore with cbind like: > > SPEC <- factor(c("a","a","b","b","c","c","c","d","e","e","e","e")) > FAM <- factor(c("A","A","A","A","B","B","B","C","C","C","C","C")) > df <- data.frame(SPEC,FAM) > > with(df, cbind("Number of SPEC"=sapply(tapply(SPEC,FAM,unique),length), > "SPECs"=tapply(SPEC,FAM,unique))) Quite close with(df, cbind("Number of SPEC"=sapply(tapply(SPEC,FAM,unique),length), "SPECs"=sapply(tapply(SPEC,FAM,unique), paste, collapse=","))) You can easily look on chunks of this code with(df, sapply(tapply(SPEC,FAM,unique),length)) with(df, sapply(tapply(SPEC,FAM,unique), paste, collapse=",")) with(df, tapply(SPEC,FAM,unique)) actually you could do better with res <- with(df, tapply(SPEC,FAM,unique)) and cbind("Number of SPEC"=sapply(res,length),"SPECs"=sapply(res, paste, collapse=",")) One comment (quite important). With cbind the result is matrix. Matrix is a vector with dimensions and as such it can have only values of one type. In this case you end with character values so the numbers are converted to character. If you want it to stay nubers you need to use data.frame see ?matrix ?data.frame and R-intro especially part regarding objects and their properties. Regards Petr > > The result should look like: > Number of SPEC SPECs > A 2 "a, b" > B 1 "c" > C 2 "d, e" > > Thank you, > > /johannes > > > -- > NEU: FreePhone - 0ct/min Handyspartarif mit Geld-zurück-Garantie! > Jetzt informieren: http://www.gmx.net/de/go/freephone ______________________________________________ R-help@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.