Reshaping several variables wide with cast
r, reshape
Solution
I think the problem is that `ff.df` is not yet sufficiently molten. Try this:
library(reshape)
# Melt it down
ff.melt <- melt(ff.df, id.var = c("surveyNum", ".id"))
# Note the new "variable" column, which will be combined
# with .id to make each column header
head(ff.melt)
surveyNum .id variable value
1 1 1 pio 2
2 2 1 pio 2
3 3 1 pio 1
4 4 1 pio 2
5 5 1 pio 1
6 6 1 pio 1
# Cast it out - note that .id comes after variable in the formula;
# I think the only effect of that is that you get "pio_1" instead of "1_pio"
ff.cast <- cast(ff.melt, surveyNum ~ variable + .id)
head(ff.cast)
surveyNum pio_1 pio_2 pio_3 caremgmt_1 caremgmt_2 caremgmt_3 prev_1 prev_2 prev_3 price_1 price_2 price_3
1 1 2 2 2 2 1 1 1 2 2 2 6 3
2 2 2 1 2 1 2 2 2 2 1 1 5 5
3 3 1 2 1 1 2 1 2 1 2 2 5 2
4 4 2 1 1 2 2 2 1 2 2 5 4 5
5 5 1 2 2 1 2 1 1 1 1 3 4 4
6 6 1 2 1 2 1 1 2 1 1 4 2 5
Does that do the trick for you?
Essentially, when casting, the variables indicated on the right-hand side of the casting formula dictate the columns that will appear in the cast result. By indicating only `.id`, I believe that you were asking `cast` to somehow cram all of those vectors of values into just three columns - 1, 2, and 3. Melting the data all the way down creates the `variable` column, which lets you specify that the combination of the `.id` and `variable` vectors should define the columns of the cast data frame.
(Sorry if I'm being repetitious/pedantic! I'm trying to work it out for myself, too)
Problem
I have a data.frame that looks like this: ``` > head(ff.df) .id pio caremgmt prev price surveyNum 1 1 2 2 1 2 1 2 1 2 1 2 1 2 3 1 1 1 2 2 3 4 1 2 2 1 5 4 5 1 1 1 1 3 5 6 1 1 2 2 4 6 ``` I'd like to reshape all four non-id variables wide by id. In other words, I want colnames: ``` surveyNum pio1 pio2 pio3 caremgmt1 caremgmt2 caremgmt3 prev1 prev2 prev3 price1 price2 price3 ``` I can do that for a single variable: ``` > cast( ff.df, surveyNum~.id, value=c("pio")) surveyNum 1 2 3 1 1 2 2 2 2 2 2 1 2 3 3 1 2 1 4 4 2 1 1 5 5 1 2 2 6 6 1 2 1 7 7 1 1 2 8 8 2 2 1 9 9 1 1 2 10 10 1 1 1 11 11 2 2 1 12 12 1 2 2 13 13 1 1 1 14 14 2 1 1 15 15 1 2 1 16 16 2 1 2 17 17 1 2 2 18 18 2 1 2 19 19 1 2 2 20 20 2 2 2 21 21 2 1 1 22 22 1 2 1 23 23 2 1 1 24 24 2 1 2 ``` But when I try it for a few it just fails utterly: ``` > cast( ff.df, surveyNum~.id, value=c("pio","caremgmt","prev","price")) Error in data.frame(data[, c(variables), drop = FALSE], result = data$value) : arguments imply differing number of rows: 72, 0 In addition: Warning message: In names(data) == value : longer object length is not a multiple of shorter object length ``` Any hints? I can use the base (stats) `reshape` command, but I'm really trying to get away from it as it causes too much manual scalp trauma from hair-pulling.... ``` ff.df <- structure(list(.id = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), pio = structure(c(2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L), .Label = c("1", "2"), class = "factor"), caremgmt = structure(c(2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L), .Label = c("1", "2"), class = "factor"), prev = structure(c(1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L), .Label = c("1", "2"), class = "factor"), price = structure(c(2L, 1L, 2L, 5L, 3L, 4L, 1L, 5L, 4L, 3L, 1L, 2L, 6L, 6L, 5L, 4L, 6L, 3L, 5L, 6L, 3L, 1L, 2L, 4L, 3L, 5L, 2L, 5L, 4L, 5L, 6L, 6L, 4L, 6L, 4L, 1L, 2L, 3L, 1L, 2L, 2L, 5L, 1L, 6L, 1L, 3L, 4L, 3L, 6L, 5L, 5L, 4L, 4L, 2L, 2L, 2L, 6L, 3L, 1L, 4L, 4L, 5L, 1L, 3L, 6L, 1L, 3L, 5L, 1L, 3L, 6L, 2L), .Label = c("1", "2", "3", "4", "5", "6"), class = "factor"), surveyNum = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 14L, 15L, 16L, 17L, 18L, 19L, 20L, 21L, 22L, 23L, 24L)), .Names = c(".id", "pio", "caremgmt", "prev", "price", "surveyNum"), row.names = c(NA, -72L), class = "data.frame") ```