Hi. I have a factor and I want to extract just those elements that appear exactly once. How to do this? Toy example follows. > a <- as.factor(c(rep("oak",5) ,rep("ash",1),rep("elm",1),rep ("beech",4))) > a [1] oak oak oak oak oak ash elm beech beech beech beech Levels: ash beech elm oak > table(a) a ash beech elm oak 1 4 1 5 > So I would want "ash" and "elm", because there is only one ash and only one elm in my wood. My Best Effort: > names(table(a)[table(a)==1]) [1] "ash" "elm" > This doesn't seem particularly elegant to me; there must be a better way! anyone? -- Robin Hankin Uncertainty Analyst National Oceanography Centre, Southampton European Way, Southampton SO14 3ZH, UK tel 023-8059-7743
another approach is: names(which(table(a) == 1)) but I don't know if you find this more elegant :) Best, Dimitris ---- Dimitris Rizopoulos Ph.D. Student Biostatistical Centre School of Public Health Catholic University of Leuven Address: Kapucijnenvoer 35, Leuven, Belgium Tel: +32/(0)16/336899 Fax: +32/(0)16/337015 Web: http://www.med.kuleuven.be/biostat/ http://www.student.kuleuven.be/~m0390867/dimitris.htm ----- Original Message ----- From: "Robin Hankin" <r.hankin at noc.soton.ac.uk> To: "RHelp" <r-help at stat.math.ethz.ch> Sent: Wednesday, February 22, 2006 10:11 AM Subject: [R] elements that appear only once> Hi. > > I have a factor and I want to extract just those elements that > appear > exactly once. > How to do this? > > Toy example follows. > > > a <- as.factor(c(rep("oak",5) ,rep("ash",1),rep("elm",1),rep > ("beech",4))) > > a > [1] oak oak oak oak oak ash elm beech beech beech > beech > Levels: ash beech elm oak > > table(a) > a > ash beech elm oak > 1 4 1 5 > > > > So I would want "ash" and "elm", because there is only one ash and > only one elm in my wood. > > My Best Effort: > > > > names(table(a)[table(a)==1]) > [1] "ash" "elm" > > > > This doesn't seem particularly elegant to me; there must be a better > way! > > anyone? > > > > > -- > Robin Hankin > Uncertainty Analyst > National Oceanography Centre, Southampton > European Way, Southampton SO14 3ZH, UK > tel 023-8059-7743 > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! > http://www.R-project.org/posting-guide.html >Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
A slight variation on your solution but hopefully more readable: names( which( table(a) == 1 ) ) Regards, Adai On Wed, 2006-02-22 at 09:11 +0000, Robin Hankin wrote:> Hi. > > I have a factor and I want to extract just those elements that appear > exactly once. > How to do this? > > Toy example follows. > > > a <- as.factor(c(rep("oak",5) ,rep("ash",1),rep("elm",1),rep > ("beech",4))) > > a > [1] oak oak oak oak oak ash elm beech beech beech beech > Levels: ash beech elm oak > > table(a) > a > ash beech elm oak > 1 4 1 5 > > > > So I would want "ash" and "elm", because there is only one ash and > only one elm in my wood. > > My Best Effort: > > > > names(table(a)[table(a)==1]) > [1] "ash" "elm" > > > > This doesn't seem particularly elegant to me; there must be a better > way! > > anyone? > > > > > -- > Robin Hankin > Uncertainty Analyst > National Oceanography Centre, Southampton > European Way, Southampton SO14 3ZH, UK > tel 023-8059-7743 > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >
I am not sure whether this is desirable but here is another way just in case: paste(setdiff(a, a[duplicated(a)])) You could replace paste with as.character if you prefer or could remove it entirely if you want the result as a factor. On 2/22/06, Robin Hankin <r.hankin at noc.soton.ac.uk> wrote:> Hi. > > I have a factor and I want to extract just those elements that appear > exactly once. > How to do this? > > Toy example follows. > > > a <- as.factor(c(rep("oak",5) ,rep("ash",1),rep("elm",1),rep > ("beech",4))) > > a > [1] oak oak oak oak oak ash elm beech beech beech beech > Levels: ash beech elm oak > > table(a) > a > ash beech elm oak > 1 4 1 5 > > > > So I would want "ash" and "elm", because there is only one ash and > only one elm in my wood. > > My Best Effort: > > > > names(table(a)[table(a)==1]) > [1] "ash" "elm" > > > > This doesn't seem particularly elegant to me; there must be a better > way! > > anyone? > > > > > -- > Robin Hankin > Uncertainty Analyst > National Oceanography Centre, Southampton > European Way, Southampton SO14 3ZH, UK > tel 023-8059-7743 > > ______________________________________________ > R-help at stat.math.ethz.ch mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide! http://www.R-project.org/posting-guide.html >