Hi, On Mon, Jan 2, 2012 at 8:08 AM, Johannes Radinger <jradin...@gmx.at> wrote: > 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?
nlevels() gives the number of levels defined, not the number of levels that have members, so for your example will always be 5. > with(df, aggregate(SPEC, by=list(FAM), nlevels)) Group.1 x 1 A 5 2 B 5 3 C 5 You could drop the unused levels before checking: > with(df, aggregate(SPEC, by=list(FAM), function(x)nlevels(factor(x)))) Group.1 x 1 A 2 2 B 1 3 C 2 Or actually get a list of which ones are used: > with(df, table(FAM, SPEC)) SPEC FAM a b c d e A 2 2 0 0 0 B 0 0 3 0 0 C 0 0 0 1 4 Sarah -- Sarah Goslee http://www.functionaldiversity.org ______________________________________________ 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.