I have some data which looks like this (fake data for example's sake):
dressId color
6 yellow
9 red
10 green
10 purple
10 yellow
12 purple
12 red
where color is a factor vector. It is not guaranteed that all possible levels of the factor actually appear in the data (e.g. the color "blue" could also be one of the levels).
I need a list of vectors which groups the available colors of each dress:
[[1]]
yellow
[[2]]
red
[[3]]
green purple yellow
[[4]]
purple red
Preserving the IDs of the dresses would be nice (e.g. a dataframe where this list is the second column and the IDs are the first), but not necessary.
I wrote a loop which goes through the dataframe row for row, and while the next ID is the same, it adds the color to a vector. (I am sure that the data is sorted by ID). When the ID in the first column changes, it adds the vector to a list:
result <- NULL
while(blah blah)
{
some code which creates the vector called "colors"
result[[dressCounter]] <- colors
dressCounter <- dressCounter + 1
}
After wrestling with getting all the necessary counting variables correct, I found out to my dismay that it doesn't work. The first time, colors
is
[1] yellow
Levels: green yellow purple red blue
and it gets coerced into an integer, so result
becomes 2
.
In the second loop repetition, colors
only contains red, and result
becomes a simple integer vector, [1] 2 4
.
In the third repetition, colors
is a vector now,
[1] green purple yellow
Levels: green yellow purple red blue
and I get
result[[3]] <- colors
Error in result[[3]] <- colors :
more elements supplied than there are to replace
What am I doing wrong? Is there a way to initialize result
so it doesn't get converted into a numeric vector, but becomes a list of vectors?
Also, is there another way to do the whole thing than "roll my own"?
In addition to
split
, you should consideraggregate
. Usec
orI
as the aggregation function to get yourlist
column:Note: This works even if the "color" variable is a
factor
, as in Ben's sample data (I missed that point when I posted the answer above) but you need to useI
as the aggregation function instead ofc
:Strangely, however, the default display shows the integer values:
split.data.frame
is a good way to organize this; then extract the color component.I think the version you want is actually this:
You can get something more like the list you requested by extracting the color component:
Assuming your data frame is saved in a variable called
df
, then you can use simplygroup_by
andsummarize
withlist
function ofdplyr
package like thisApplied to your example: