2016-01-20 2 views
3

Whis эти данные кадра,Reshape из базы против dcast из reshape2 с пропущенными значениями

df <- expand.grid(id="01", parameter=c("blood", "saliva"), visit=c("V1", "V2", "V3")) 
df$value <- c(1:6) 
df$sex <- rep("f", 6) 
df 

> df 
    id parameter visit value sex 
1 01  blood V1  1 f 
2 01 saliva V1  2 f 
3 01  blood V2  3 f 
4 01 saliva V2  4 f 
5 01  blood V3  5 f 
6 01 saliva V3  6 f 

Когда я перепрофилировать его в формате «широкий», я получаю одинаковые результаты как с помощью функции базового reshape и функции dcast от reshape2.

reshape(df, 
     timevar="visit", 
     idvar=c("id", "parameter", "sex"), 
     direction="wide") 

    id parameter sex value.V1 value.V2 value.V3 
1 01  blood f  1  3  5 
2 01 saliva f  2  4  6 


library(reshape2) 
dcast(df, 
     id+parameter+sex~visit, 
     value.var="value") 

    id parameter sex V1 V2 V3 
1 01  blood f 1 3 5 
2 01 saliva f 2 4 6 

Но если добавить некоторые недостающие значения, результаты отличается

df$value <- c(1,2,NA,NA,NA,NA) 
df$sex <- c(NA,NA,NA,NA,NA,NA) 
df 

> df 
    id parameter visit value sex 
1 01  blood V1  1 NA 
2 01 saliva V1  2 NA 
3 01  blood V2 NA NA 
4 01 saliva V2 NA NA 
5 01  blood V3 NA NA 
6 01 saliva V3 NA NA 

С базой reshape, я получаю только один ряд

reshape(df, 
     timevar="visit", 
     idvar=c("id", "parameter", "sex"), 
     direction="wide") 

    id parameter sex value.V1 value.V2 value.V3 
1 01  blood NA  1  NA  NA 

С dcast, я получаю два ряда

dcast(df, 
     id+parameter+sex~visit, 
     value.var="value") 

    id parameter sex V1 V2 V3 
1 01  blood NA 1 NA NA 
2 01 saliva NA 2 NA NA 

Есть ли способ справиться с этими недостающими значениями в базе reshape, как я хотел бы использовать этот?

+1

На странице справки, не очевидно, что, как 'reshape' обрабатывает недостающие значения. – akrun

+1

Но где идет не-'' '' значение '2'? – jogo

+0

В этом суть. Я хотел бы знать, где это происходит! – user3631369

ответ

1

Соответствующая часть reshape кода будет строка:

data[, tempidname] <- interaction(data[, idvar], drop = TRUE) 

Посмотрите, как interaction работы:

> interaction("A", "B") 
[1] A.B 
Levels: A.B 
> interaction("A", "B", NA) 
[1] <NA> 
Levels: 

Но сравнивать то, что произошло бы, если NA были сохранены в качестве level:

> interaction("A", "B", addNA(NA)) 
[1] A.B.NA 
Levels: A.B.NA 

Таким образом, если вы хотите получить тот же результат с базой R reshape, вам нужно убедиться, что в столбцах «idvar» есть NA, сохраненный как уровень.

Пример:

df$sex <- addNA(df$sex) 
reshape(df, 
     timevar="visit", 
     idvar=c("id", "parameter", "sex"), 
     direction="wide") 
# id parameter sex value.V1 value.V2 value.V3 
# 1 01  blood <NA>  1  NA  NA 
# 2 01 saliva <NA>  2  NA  NA 

Конечно, другой вопрос, как NA можно рассматривать в качестве идентифицирующего переменной :-)

 Смежные вопросы

  • Нет связанных вопросов^_^