Skip to content
Back to formatted view

Raw Message

Message-ID: <CADv2QyHbqoP+Di=EGBBgpZqgsDkDd+bK3M4GeRU6_Ly-QPEneQ@mail.gmail.com>
Date: 2011-10-23T05:35:12Z
From: Dennis Murphy
Subject: Expanding rows of a data frame into multiple rows
In-Reply-To: <CAJoaRha4DBS2Ayv0r-55NSfice9PaHvo5mudNxOdY6QzKBUgig@mail.gmail.com>

Here's another approach using the plyr package:

# Function to process each row of input:
g <- function(d) {
    y <- unlist(d$observations)
    if(length(y) > 0)
      data.frame(site = d$site, sector = d$sector, y = y) else NULL
  }

library('plyr')
> ddply(input, .(site), g)
   site sector  y
1     1  north  1
2     1  north  2
3     1  north  3
4     2  south  4
5     2  south  3
6     4   west 14
7     4   west 12
8     4   west 53
9     4   west  2
10    4   west  4
11    5   east  3
12    6  south 23

HTH,
Dennis

On Sat, Oct 22, 2011 at 4:51 PM, Peter Meilstrup
<peter.meilstrup at gmail.com> wrote:
> The setup: I have a data frame where one column is in list mode, and
> each entry contains a vector of varying length.
> I want to expand this into a data frame with one row for each member
> of the list-mode column (the other values being replicated)
>
> For example, an example input and the desired output would be:
>
> ?input <- data.frame(site = 1:6,
> ? ? ? ? ? ? ? ? ? ? ?sector = factor(c("north", "south", "east",
> "west", "east", "south")),
> ? ? ? ? ? ? ? ? ? ? ?observations =
> I(list(c(1,2,3),c(4,3),c(),c(14,12,53,2,4),c(3),c(23))))
>
> ?desired.output <-
> ? ?data.frame(site = c(1,1,1,2,2,4,4,4,4,5,6),
> ? ? ? ? ? ? ? sector = factor(c(2,2,2,3,3,4,4,4,4,4,1,3),
> ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? labels = c("east", "north", "south", "west")),
> ? ? ? ? ? ? ? observations = c(1,2,3,4,3,14,12,53,2,4,3,23))
>
> There seems like there ought to be a good (simple, fast) way to do
> this, but I've been struggling. Any ideas?
>
> --
> You received this message because you are subscribed to the Google Groups "manipulatr" group.
> To post to this group, send email to manipulatr at googlegroups.com.
> To unsubscribe from this group, send email to manipulatr+unsubscribe at googlegroups.com.
> For more options, visit this group at http://groups.google.com/group/manipulatr?hl=en.
>
>