[R] uniq -c

Sam Steingold sds at gnu.org
Tue Oct 16 17:03:27 CEST 2012

I need an analogue of "uniq -c" for a data frame.

xtabs(), although dog slow, would have footed the bill nicely:
--8<---------------cut here---------------start------------->8---
> x <- data.frame(a=1:32,b=1:32,c=1:32,d=1:32,e=1:32)
> system.time(subset(as.data.frame(xtabs( ~. , x )), Freq != 0 ))
   user  system elapsed 
 12.788   4.288  17.224
--8<---------------cut here---------------end--------------->8---
but, alas, if fails on larger data:
system.time(subset(as.data.frame(xtabs( ~. , x )), Freq != 0 ))
Error in table(a = 1:32, b = 1:32, c = 1:32, d = 1:32, e = 1:32, f = 1:32,  : 
  attempt to make a table with >= 2^31 elements
(apparently, because the product of the numbers of all the possible
values of all the columns is too large).

rle() seems to be what I really need, but I cannot figure out what it
returns for a simple example:
--8<---------------cut here---------------start------------->8---
> x <- data.frame(a=1:32,b=1:32,c=1:32,d=1:32,e=1:32,f=1:32,g=1:32,h=1:32)
> rle(x)
Run Length Encoding
  lengths: int 8
  values :'data.frame':	32 obs. of  1 variable:
 $ h: int  1 2 3 4 5 6 7 8 9 10 ...
--8<---------------cut here---------------end--------------->8---
(where are all the other columns?)

and it fails on my actual data (3 column of factors):
Error in Ops.factor(left, right) : level sets of factors are different

when I replace factors with strings, I get:
Error in `[.data.frame`(x, i) : undefined columns selected

--8<---------------cut here---------------start------------->8---
structure(list(user = c("45ff768774777593", "45ff768774777593", 
"45ff768774777593", "45ff768774777593", "45ff768774777593", "4bbf9e94cbceb70c", 
"4bbf9e94cbceb70c", "4fbbf2c67e0fb867", "4fbbf2c67e0fb867", "5038d46739f9f516", 
"4f39c65c2704e79e", "4f39c65c2704e79e", "4f39c65c2704e79e", "4f39c65c2704e79e", 
"4f39c65c2704e79e", "4f39c65c2704e79e", "4f39c65c2704e79e", "4fe9e0496ecfc55e", 
"4fe9e0496ecfc55e", "4fe9e0496ecfc55e", "506b92707a3aa65f", "502c0a9ba9ce5019", 
"502c0a9ba9ce5019", "502c0a9ba9ce5019", "502c0a9ba9ce5019", "501b52fe24d88162", 
"4fd4852ed504b160", "4fd4852ed504b160", "4fd4852ed504b160", "4fd4852ed504b160", 
"4fd4852ed504b160", "4fd4852ed504b160", "4fd4852ed504b160", "4fd4852ed504b160", 
"4fd4852ed504b160", "4fd4852ed504b160", "4e717c219268b736", "4e717c219268b736", 
"4e717c219268b736", "506bb429eeab2af4", "506bb429eeab2af4", "506bb429eeab2af4", 
"4f6f91cb83e1a7ef", "506bb8b62bde3c48", "506bb8b62bde3c48", "506bb8b62bde3c48", 
"506bb8b62bde3c48", "4edff2aeb4df7613", "4edff2aeb4df7613", "506bba652fa6bf78", 
"506a4941b50ca422", "506a4941b50ca422", "506a4941b50ca422", "506a4941b50ca422", 
"506a4941b50ca422", "506a4941b50ca422", "506a4941b50ca422", "506a4941b50ca422", 
"506a4941b50ca422", "5036993a16b323d1", "5036993a16b323d1", "5036993a16b323d1", 
"5036993a16b323d1", "5036993a16b323d1", "5036993a16b323d1", "5036993a16b323d1", 
"5036993a16b323d1", "506bb525ffce3add", "506bb6cf52819b5f", "506bb6cf52819b5f", 
"4fe02e08a6a2ce64", "4fe02e08a6a2ce64", "5056d247bc7dae0b", "5056d247bc7dae0b", 
"5056d247bc7dae0b", "506abfecf61bf4e6", "4ec00aa243745ee5", "4ec00aa243745ee5", 
"4ec00aa243745ee5", "4ec00aa243745ee5", "506c69d7fb598afa", "5065a0c59c59c111", 
"5065a0c59c59c111", "5065a0c59c59c111", "5065a0c59c59c111", "5065a0c59c59c111", 
"5065a0c59c59c111", "5065a0c59c59c111", "5065a0c59c59c111", "5065a0c59c59c111", 
"5065a0c59c59c111", "5065a0c59c59c111", "5065a0c59c59c111", "5065a0c59c59c111", 
"5065a0c59c59c111", "5065a0c59c59c111", "5065a0c59c59c111", "5065a0c59c59c111", 
"5065a0c59c59c111", "5065a0c59c59c111"), country = c("AR", "AR", 
"AR", "AR", "AR", "BG", "BG", "SK", "SK", "US", "VE", "VE", "VE", 
"VE", "VE", "VE", "VE", "TH", "TH", "TH", "MY", "US", "US", "US", 
"US", "MX", "JP", "JP", "JP", "JP", "JP", "JP", "JP", "JP", "JP", 
"JP", "US", "US", "US", "US", "US", "US", "NP", "US", "US", "US", 
"US", "MX", "MX", "US", "AR", "AR", "AR", "AR", "AR", "AR", "AR", 
"AR", "AR", "CO", "CO", "CO", "CO", "CO", "CO", "CO", "CO", "US", 
"MM", "MM", "US", "US", "IN", "IN", "IN", "IN", "CA", "CA", "CA", 
"CA", "US", "DE", "DE", "DE", "DE", "DE", "DE", "DE", "DE", "DE", 
"DE", "DE", "DE", "DE", "DE", "DE", "DE", "DE", "DE", "DE"), 
    language = c("es", "es", "es", "es", "es", "bg", "bg", "sk", 
    "sk", "en", "es", "es", "es", "es", "es", "es", "es", "th", 
    "th", "th", "en", "en", "en", "en", "en", "es", "en", "en", 
    "en", "en", "en", "en", "en", "en", "en", "en", "en", "en", 
    "en", "en", "en", "en", "en", "en", "en", "en", "en", "es", 
    "es", "en", "es", "es", "es", "es", "es", "es", "es", "es", 
    "es", "es", "es", "es", "es", "es", "es", "es", "es", "en", 
    "en", "en", "en", "en", "en", "en", "en", "en", "fr", "fr", 
    "fr", "fr", "en", "de", "de", "de", "de", "de", "de", "de", 
    "de", "de", "de", "de", "de", "de", "de", "de", "de", "de", 
    "de", "de")), .Names = c("user", "country", "language"), row.names = c(1L, 
2L, 3229330L, 3229331L, 3229332L, 3L, 9504492L, 4L, 9504493L, 
5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 4989444L, 
4989445L, 4989446L, 18L, 19L, 20L, 21L, 22L, 95114L, 95115L, 
95116L, 95117L, 9504509L, 9599604L, 23L, 3319263L, 3319264L, 
24L, 25L, 9504513L, 26L, 27L, 28L, 7548719L, 7548720L, 29L, 30L, 
31L, 32L, 2498862L, 2498863L, 2498864L, 2498865L, 4560918L, 4560919L, 
5938642L, 14065408L, 33L, 4348151L, 4348152L, 5627634L, 5627635L, 
9504522L, 13852641L, 15132124L, 34L, 35L, 6400711L, 36L, 2173763L, 
37L, 38L, 39L, 40L, 41L, 10210641L, 10672811L, 16158334L, 42L, 
43L, 44L, 45L, 1974646L, 4032952L, 4032953L, 4032954L, 4032955L, 
4032956L, 4032957L, 4032958L, 4475376L, 4475377L, 4475378L, 4475379L, 
5500564L, 7871329L, 7871330L, 8670694L), class = "data.frame")
--8<---------------cut here---------------end--------------->8---


Sam Steingold (http://sds.podval.org/) on Ubuntu 12.04 (precise) X 11.0.11103000
http://www.childpsy.net/ http://thereligionofpeace.com http://dhimmi.com
http://ffii.org http://truepeace.org http://mideasttruth.com
Bus error -- please leave by the rear door.

More information about the R-help mailing list