2016-11-03 5 views
0

Как я могу преобразовать данные X в Y, как вR reshape2 dcast: преобразование данных

X = data.frame(
    ID = c(1,1,1,2,2), 
    NAME = c("MIKE","MIKE","MIKE","LUCY","LUCY"), 
    SEX = c("MALE","MALE","MALE","FEMALE","FEMALE"), 
    TEST = c(1,2,3,1,2), 
    SCORE = c(70,80,90,65,75) 
) 

Y = data.frame(
    ID = c(1,2), 
    NAME = c("MIKE","LUCY"), 
    SEX = c("MALE","FEMALE"), 
    TEST_1 =c(70,65), 
    TEST_2 =c(80,75), 
    TEST_3 =c(90,NA) 
) 

dcast функция в reshape2, кажется, работает, но он не может включать в себя другие столбцы данных, такие как ID, имя и SEX в приведенном выше примере.

Предполагая, что все остальные столбцы по столбцу ID согласованы, например, Майк может быть только мужчиной с идентификатором 1, как мы можем это сделать?

+2

Что вы попробовали? Это похоже на работу: 'dcast (X, ID + NAME + SEX ~ TEST, value.var =" SCORE ")' –

+0

Или используйте 'library (tidyr), spread (X, TEST, SCORE)' – akrun

ответ

1

Согласно документации (?reshape2::dcast) dcast() позволяет ... в формуле:

"..." представляет все другие переменные, не используемые в формуле ...

Этот справедливо как для reshape2, так и для пакетов data.table, которые поддерживают dcast().

Таким образом, вы можете написать:

reshape2::dcast(X, ... ~ TEST, value.var = "SCORE") 
# ID NAME SEX 1 2 3 
#1 1 MIKE MALE 70 80 90 
#2 2 LUCY FEMALE 65 75 NA 

Однако, если ОП настаивает на том, что имена столбцов должны быть TEST_1, TEST_2 и т.д., TEST столбец должен быть модифицирован до перестройки. Здесь data.table используется:

library(data.table) 
dcast(setDT(X)[, TEST := paste0("TEST_", TEST)], ... ~ TEST, value.var = "SCORE") 
# ID NAME SEX TEST_1 TEST_2 TEST_3 
#1: 1 MIKE MALE  70  80  90 
#2: 2 LUCY FEMALE  65  75  NA 

, который в соответствии с ожидаемым ответом дается как data.frame Y.

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