2013-04-16 3 views
1

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

library(reshape) 

df <- as.data.frame(cbind(c(1,1,2,2,3,3),c(2000,2001,2001,2002,2000,2001),c(2,1,4,3,1,5))) 
names(df) <- c("Id","Year","Var") 

df$Fac <- interaction(c(1,1,1,0,0,0),c(0,0,0,1,1,1),drop=TRUE) 

MData <- melt.data.frame(df,id=c("Year","Id")) 
RSData <- cast(MData, Id ~ Year | ...) 

операция работает, но недостающие наблюдения в RSData не NAs, как они должны быть, а скорее строки (< NA> и не NA):

$Var 
    Id 2000 2001 2002 
1 1 2 1 <NA> 
2 2 <NA> 4 3 
3 3 1 5 <NA> 

$Fac 
    Id 2000 2001 2002 
1 1 1.0 1.0 <NA> 
2 2 <NA> 1.0 0.1 
3 3 0.1 0.1 <NA> 

Если я, однако, не учитывать фактор САМ нормальный NAs:

df <- as.data.frame(cbind(c(1,1,2,2,3,3),c(2000,2001,2001,2002,2000,2001),c(2,1,4,3,1,5))) 
names(df) <- c("Id","Year","Var") 

MData <- melt.data.frame(df,id=c("Year","Id")) 
RSData <- cast(MData, Id ~ Year | ...) 

выходной сигнал становится:

$Var 
    Id 2000 2001 2002 
1 1 1 1 NA 
2 2 NA 1 0 
3 3 0 0 NA 

Строчные НС дают мне проблемы, когда я пытаюсь использовать свои данные перезаписи. Как получить правильные NA, когда у меня есть фактор и числовые переменные в кадре данных, который я хочу расплавить и переделать?

Спасибо,

M

+0

ли dummy1 и Dummy2 должны быть числовыми или факторы? Вы начинаете с переменной 'Fac', которая является фактором, но расплавляется в числовые переменные Dummy1 и Dummy2. – joran

+0

@joran Итак, они две переменные «Dummy1» и «Dummy2» являются числовыми, но принимают только 0 и 1. Я хочу объединить их в фактор «Fac». Я знаю, что в этом маленьком примере создание нового фактора не имеет большого смысла, но в моих реальных данных у меня есть несколько манекенов и, таким образом, получить более двух уровней в результирующем коэффициенте. – Mace

+0

Но большая проблема здесь в том, что когда вы _melt_ df, R пытается складывать Fac поверх всех переменных Dummy. При этом он должен найти один, общий тип данных для использования. Даже если это все факторы, вы столкнетесь с проблемами слияния факторов. Вы действительно хотите включить переменные Dummy при плавлении? – joran

ответ

0

Я уверен, что я нашел ответ на свой вопрос, прочитав комментарии и документацию снова и снова. Базисно, проблема в том, что при использовании метода melt.data.frame() все значения переменных помещаются в 1 столбец, и поскольку у меня есть как строки, так и числовые значения, числовые значения неявно преобразуются в строки.

Единственный способ обойти это, я вижу, чтобы изменить числовые переменные и факторы по отдельности:

MDataNum = melt.data.frame(df[c("Id","Year","Var")],id=c("Year","Id")) 
RSDataNum <- cast(MDataNum, Id ~ Year | ...) 

MDataFac = melt.data.frame(df[c("Id","Year","Fac")],id=c("Year","Id")) 
RSDataFac <- cast(MDataFac, Id ~ Year | ...) 

Результат становится:

> RSDataNum 
$Var 
    Id 2000 2001 2002 
1 1 2 1 NA 
2 2 NA 4 3 
3 3 1 5 NA 

> RSDataFac 
$Fac 
    Id 2000 2001 2002 
1 1 1.0 1.0 <NA> 
2 2 <NA> 1.0 0.1 
3 3 0.1 0.1 <NA> 
Смежные вопросы