Skip to content

elements that appear only once

7 messages · robin hankin, Dimitris Rizopoulos, Adaikalavan Ramasamy +3 more

#
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
Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
#
Hi Dmitris, and list
On 22 Feb 2006, at 09:24, Dimitris Rizopoulos wrote:

            
well, thank you for this (which() is good here!) but this is still  
"inelegant" IMHO
because it uses the names() of a table.

If I had

 > a <- as.factor(c(1,1,1,2,3,4,4,4,4,5))
 > names(which(table(a)==1))
[1] "2" "3" "5"
 >

this gives a character vector.

I could coerce using  as.integer() here, but this seems so....inelegant.

best wishes


Robin
--
Robin Hankin
Uncertainty Analyst
National Oceanography Centre, Southampton
European Way, Southampton SO14 3ZH, UK
  tel  023-8059-7743
#
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:
#
On Wed, 22 Feb 2006, Robin Hankin wrote:

            
Since the names of the table are the levels of the factor, I would use

levels(a)[table(a) %in% 1]

Well, almost.  If you have NA or NaN as a factor level then all these 
solutions need to be more complicated.
But a has a character vector of levels, and there is nothing there to tell 
R that you wanted integers and not decimal-digit character strings.
#
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:
#
Robin Hankin <r.hankin at noc.soton.ac.uk> writes:
You could go 

sort(unique(a))[table(a)==1]

(without the sort(), things go pearshaped, try setting

a <- factor(c(1,1,1,2,3,4,4,4,4,5),levels=5:1)

wnd you'll see).

If we assume that a is a factor, another option is

levels(a))[table(a)==1]

but that also has the problem of returning a character vector.