2016-08-09 2 views
0

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

df <- 
ID TIME IPREDP IPREDM 
1  0.5 10  5 
1  1.0 15  7 
2  0.7 8   2 

Я хочу, чтобы изменить свои данные и свернуть IPREDP и IPREDM столбцов в один столбец под названием IPRED и добавить флаг под названием DVID для каждого и избавиться от оригинальных колонок IPREDP и IPREDM. Таким образом, выход должен быть таким:

dfout <- 
ID TIME DVID IPRED 
1  0.5  1  10 
1  0.5  2  5 
1  1.0  1  15 
1  1.0  2  7 
2  0.7  1  8 
2  0.7  2  2 

Как я могу достичь этого в R самым быстрым способом?

+0

С tidyr и dplyr, 'ДФ%>% собираются (DVID, IPRED, IPREDP: IPREDM)%>% мутировать (DVID = а .integer (factor (DVID, levels = c ('IPREDP', 'IPREDM')))) ' – alistaire

+0

с использованием библиотеки (reshape2),' melt (df, measure.vars = c ("IPREDP", "IPREDM"), value.name = "IPRED") ' – dww

+0

В базе R -' reshape (df, idvar = c ("ID", "TIME"), direction = "long", variable = 3: 4, v.names = "IPRED ", timevar =" DVID ")' – thelatemail

ответ

2
library(reshape2) 
dfout <- melt(df,measure=c("IPREDP","IPREDM"), value="IPRED", variable="DVID") 
dfout$DVID <- as.integer(dfout$DVID) 
1

Мы можем использовать melt из data.table

library(data.table) 
melt(setDT(df), id.var = c("ID", "TIME"), value.name = "IPRED")[ 
      order(ID)][, DVID := 1:.N,.(ID, variable)][] 
2
library("data.table") 
    df1 <- melt(df, id = c("ID", "TIME"), measure = c("IPREDP", "IPREDM"), value.name = "IPRED") 
    df1$DVID <- as.integer(df1$variable) 
    df1[, variable := NULL] 
Смежные вопросы