2013-07-19 5 views
0

Я пишу код для создания отчетов об учебных предметах и ​​сроках их последующих посещений. У меня есть данные, что выглядит следующим образом:Создание столбцов на основе уровней факторов в базе R reshape()

subj_id timepoint   date 
    100 3 month  2013-01-01 
    101 3 month  2013-01-12 
    102 3 month  2013-02-01 
    ...  ...   ... 

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

Так, в моем примере переменная timepoint является фактором с четырьмя уровнями: 3 месяца, 6 месяцев, 9 месяцев и 12 месяцев. Однако на данном этапе исследования у нас не было никого, кто прошел бы через 3 месяца, так что данные - это только строки 100, 101 и 102 выше.

Используя следующие команды, вы можете получить то, что я вижу (очевидно, что это не то, как создается мои данные):

test_df <- data.frame(subj_id=c(100,101,102), 
         timepoint=c("3 month","3 month","3 month"), 
         date=c(as.Date("2013-01-01"), 
          as.Date("2013-01-12"), 
          as.Date("2013-02-01"))) 

test_df$timepoint <- factor(x=test_df$timepoint, 
          levels=c("3 month","6 month", 
            "9 month","12 month"), 
          labels=c("3 month","6 month", 
            "9 month","12 month"), 
          ordered=TRUE) 

print(test_df) 
> subj_id timepoint  date 
> 1  100 3 month 2013-01-01 
> 2  101 3 month 2013-01-12 
> 3  102 3 month 2013-02-01 

levels(test_df$timepoint) 
> [1] "3 month" "6 month" "9 month" "12 month" 

reshape(data=test_df,v.names="date", 
     timevar="timepoint",idvar="subj_id",direction="wide") 

> subj_id date.3 month 
> 1  100 2013-01-01 
> 2  101 2013-01-12 
> 3  102 2013-02-01 

То, что я хотел бы получить было бы что-то вроде этого:

> subj_id date.3 month date.6 month date.9 month date.12 month 
> 1  100 2013-01-01   NA   NA    NA 
> 2  101 2013-01-12   NA   NA    NA 
> 3  102 2013-02-01   NA   NA    NA 

Есть ли способ сделать это в базе reshape? Моя нынешняя мысль состоит в том, чтобы поставить четыре «поддельные» записи до того, как я запустил reshape, чтобы увидеть четыре уровня и создать кадр данных соответственно, но в лучшем случае это похоже на kludgy. Есть ли способ лучше?

+0

установить 'timepoint' в коэффициент, задающий нужный вам уровень, тогда изменить формулу –

+0

' timepoint' уже является фактором. Это всего лишь фактор, когда только один из уровней находится в области данных прямо сейчас. – TARehman

ответ

2

Вот способ программно расширить dataframe добавить столбцы для незаселенных уровней .:

> new_df <- reshape(data=test_df, 
+   timevar="timepoint",idvar="subj_id",direction="wide") 
> new_df 
    subj_id date.3 month 
1  100 2013-01-01 
2  101 2013-01-12 
3  102 2013-02-01 
> new_df[ , setdiff(levels(test_df$timepoint) , 
         factor(test_df$timepoint)) ] <- NA 
> 
> new_df 
    subj_id date.3 month 6 month 9 month 12 month 
1  100 2013-01-01  NA  NA  NA 
2  101 2013-01-12  NA  NA  NA 
3  102 2013-02-01  NA  NA  NA 

Примечание: Эти имена столбцов всегда должны быть заключены в кавычки, потому что у них есть пробелы. Я никогда не позволяю именам столбцов оставаться таким.

+0

Да, я обязательно изменю столбцы, чтобы они не требовались. Благодаря! – TARehman

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