Использование Melt/Cast с переменными неравномерной длины в R

Я работаю с большим фреймом данных, который хочу повернуть, чтобы переменные в столбце стали строками сверху.

Я нашел пакет reshape очень полезным в таких случаях, за исключением того, что функция приведения по умолчанию имеет значение fun.aggregate=length. Предположительно, это связано с тем, что я выполняю эти операции по «случаям», а количество измеряемых переменных варьируется в зависимости от случаев.

Я хотел бы повернуться так, чтобы отсутствующие переменные обозначались как «NA» в сводном фрейме данных.

Итак, другими словами, я хочу перейти от расплавленного фрейма данных следующим образом:

Case | Variable | Value
 1         1        2.3
 1         2        2.1
 1         3        1.3
 2         1        4.3
 2         2        2.5
 3         1        1.8
 3         2        1.9
 3         3        2.3
 3         4        2.2

Что-то вроде этого:

Case | Variable 1 | Variable 2 | Variable 3 | Variable 4
 1         2.3          2.1          1.3         NA
 2         4.3          2.5          NA          NA
 3         1.8          1.9          2.3         2.2 

Код dcast(data,...~Variable) снова по умолчанию имеет значение fun.aggregate=length, что не сохраняет исходные значения.

Спасибо за вашу помощь, и дайте мне знать, если что-то неясно!


person Jon    schedule 17.06.2011    source источник
comment
Может стоит попробовать dcast в reshape2? Когда я запускаю ваш оператор dcast с помощью reshape2, я получаю желаемый результат (т.е. со значениями NA).   -  person joran    schedule 18.06.2011
comment
Согласен с @Joran - reshape2 это правильный путь   -  person Prasad Chalasani    schedule 18.06.2011
comment
Хм, кажется, я сделал свой пример слишком простым, потому что он действительно работает с этим утверждением. Однако для большого набора данных, с которым я работаю, этого не произойдет. Спасибо за ваши комментарии!   -  person Jon    schedule 18.06.2011


Ответы (3)


Это просто вопрос включения всех переменных в вызов cast. Reshape ожидает, что столбец Value будет называться value, поэтому он выдает предупреждение, но все равно работает нормально. Причина, по которой он использовал fun.aggregate=length, заключается в отсутствии Case в формуле. Он агрегировал значения в Case.

Попробуйте: cast(data, Case~Variable)

data <- data.frame(Case=c(1,1,1,2,2,3,3,3,3),
  Variable=c(1,2,3,1,2,1,2,3,4),
  Value=c(2.3,2.1,1.3,4.3,2.5,1.8,1.9,2.3,2.2))

cast(data,Case~Variable)
Using Value as value column.  Use the value argument to cast to override this choice
  Case   1   2   3   4
1    1 2.3 2.1 1.3  NA
2    2 4.3 2.5  NA  NA
3    3 1.8 1.9 2.3 2.2

Изменить: в ответ на комментарий от @Jon. Что делать, если во фрейме данных есть еще одна переменная?

data <- data.frame(expt=c(1,1,1,1,2,2,2,2,2),
               func=c(1,1,1,2,2,3,3,3,3),
               variable=c(1,2,3,1,2,1,2,3,4),
               value=c(2.3,2.1,1.3,4.3,2.5,1.8,1.9,2.3,2.2))

cast(data,expt+variable~func)
  expt variable   1   2   3
1    1        1 2.3 4.3  NA
2    1        2 2.1  NA  NA
3    1        3 1.3  NA  NA
4    2        1  NA  NA 1.8
5    2        2  NA 2.5 1.9
6    2        3  NA  NA 2.3
7    2        4  NA  NA 2.2
person Community    schedule 17.06.2011
comment
Я все еще пытаюсь понять это утверждение fun.aggregate. У меня есть расплавленный фрейм данных с заголовками столбцов Expt, function., variable и value. Я хочу повернуть переменные в функции. вверху как функция Expt и переменной. Итак, моя функция - dcast (данные, Expt + переменная ~ функция.). Я все еще получаю, что функция агрегирования отсутствует: ошибка по умолчанию для длины, хотя... есть мысли? - person Jon; 18.06.2011
comment
@Jon, если эти четыре столбца - это все, что у вас есть в вашем расплавленном фрейме данных data, cast(data, Expt + variable ~ function) должен работать. Если вы отредактируете свой вопрос с новой информацией, я постараюсь обновить свой ответ. - person ; 18.06.2011

Вот одно из решений. Он не использует упомянутый вами пакет или функцию, но может быть полезен. Предположим, ваш фрейм данных называется df:

M <- matrix(NA,
            nrow = length(unique(df$Case)),
            ncol = length(unique(df$Variable))+1,
            dimnames = list(NULL,c('Case',paste('Variable',sort(unique(df$Variable))))))
irow <- match(df$Case,unique(df$Case))
icol <- match(df$Variable,unique(df$Variable)) + 1
ientry <- irow + (icol-1)*nrow(M)
M[ientry] <- df$Value
M[,1] <- unique(df$Case)
person nullglob    schedule 17.06.2011

Чтобы избежать предупреждающего сообщения, вы можете подмножить фрейм данных в соответствии с другой переменной, то есть категориальной переменной, имеющей три уровня a, b, c. Поскольку в ваших текущих данных для категории a имеется 70 случаев, для b — 80 случаев, для c — 90. Тогда функция приведения не знает, как их агрегировать.

Надеюсь это поможет.

person user3041651    schedule 27.11.2013