[R] DF grouping

Petr Savicky savicky at cs.cas.cz
Sun Feb 12 18:39:45 CET 2012


On Sun, Feb 12, 2012 at 07:07:26AM -0800, karthicklakshman wrote:
> Hello Members,
> 
> I need to group a data.frame in a a specific way, like shown below,
> 
> DF raw is like this,
> 
> id col1 col2 score
> 1  A      B       40
> 2  B      C       55
> 3  C      D       4000
> 4  D      E        100
> 5  E       F        300
> 
> I want the out put as
> 
> List
> [1]
> A B C
> [2]
> D E
> [3]
> F
> Basically the split should be based on the DF$score > 200, and all the col1
> and col2 values should be aggrigated.

Hi.

Is it always true that DF[i, "col2"] == DF[i+1, "col1"]?
If yes, then try the following

  # dput() of DF
  DF <- structure(list(col1 = structure(1:5, .Label = c("A", "B", "C",
  "D", "E"), class = "factor"), col2 = structure(1:5, .Label = c("B",
  "C", "D", "E", "F"), class = "factor"), score = c(40L, 55L, 4000L,
  100L, 300L)), .Names = c("col1", "col2", "score"), class = "data.frame",
  row.names = c(NA, -5L))
 
  # linearize col1, col2
  objects <- c(as.character(DF[1, "col1"]), as.character(DF[, "col2"]))
  scores <- c(0, DF[, "score"])
 
  # output as list of vectors
  out1 <- split(objects, cumsum(scores > 200))
  out1

  $`0`
  [1] "A" "B" "C"
  
  $`1`
  [1] "D" "E"
  
  $`2`
  [1] "F"

  # output as list of character strings
  out2 <- lapply(out1, paste, collapse=" ")
  out2

  $`0`
  [1] "A B C"
  
  $`1`
  [1] "D E"
  
  $`2`
  [1] "F"

Hope this helps.

Petr Savicky.



More information about the R-help mailing list