Я пишу код для создания отчетов об учебных предметах и сроках их последующих посещений. У меня есть данные, что выглядит следующим образом:Создание столбцов на основе уровней факторов в базе 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. Есть ли способ лучше?
установить 'timepoint' в коэффициент, задающий нужный вам уровень, тогда изменить формулу –
' timepoint' уже является фактором. Это всего лишь фактор, когда только один из уровней находится в области данных прямо сейчас. – TARehman