Использование melt / cast с переменными неравной длины в R - PullRequest
4 голосов
/ 18 июня 2011

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

Я нашел пакет reshape очень полезным в таких случаях, за исключением того, что функция cast по умолчанию имеет значение 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, который не сохраняет исходные значения.

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

Ответы [ 3 ]

5 голосов
/ 18 июня 2011

Это просто вопрос включения всех переменных в вызов 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
0 голосов
/ 27 ноября 2013

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

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

0 голосов
/ 18 июня 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)
...