Альтернативы stats :: reshape

Функции плавления / литья в пакете reshape великолепны, но я не уверен, есть ли простой способ применить их, когда измеряемые переменные имеют разные типы. Например, вот фрагмент из данных, где каждый MD предоставляет пол и вес трех пациентов:

ID PT1 WT1 PT2 WT2 PT3 WT3
1  "M" 170 "M" 175 "F" 145
...

где цель состоит в том, чтобы изменить форму так, чтобы каждая строка была пациентом:

ID PTNUM GENDER WEIGHT
1    1     "M"    170
1    2     "M"    175
1    3     "F"    145
...

Использование функции изменения формы в пакете статистики - одно вариант, о котором я знаю, но я публикую здесь в надежде, что более опытные пользователи R, чем я, разместят другие, надеюсь, лучшие методы. Большое спасибо!

-

@Vincent Zoonekynd:

Мне очень понравился ваш пример, поэтому я обобщил его на несколько переменных.

# Sample data
n <- 5
d <- data.frame(
  id = 1:n,
  p1 = sample(c("M","F"),n,replace=TRUE),
  q1 = sample(c("Alpha","Beta"),n,replace=TRUE),
  w1 = round(runif(n,100,200)),
  y1 = round(runif(n,100,200)),
  p2 = sample(c("M","F"),n,replace=TRUE),
  q2 = sample(c("Alpha","Beta"),n,replace=TRUE),
  w2 = round(runif(n,100,200)),
  y2 = round(runif(n,100,200)),
  p3 = sample(c("M","F"),n,replace=TRUE),
  q3 = sample(c("Alpha","Beta"),n,replace=TRUE),
  w3 = round(runif(n,100,200)),
  y3 = round(runif(n,100,200))
  )
# Reshape the data.frame, one variable at a time
library(reshape)
d1 <- melt(d, id.vars="id", measure.vars=c("p1","p2","p3","q1","q2","q3"))
d2 <- melt(d, id.vars="id", measure.vars=c("w1","w2","w3","y1","y2","y3"))
d1 = cbind(d1,colsplit(d1$variable,names=c("var","ptnum")))
d2 = cbind(d2,colsplit(d2$variable,names=c("var","ptnum")))
d1$variable = NULL
d2$variable = NULL
d1c = cast(d1,...~var)
d2c = cast(d2,...~var)
# Join the two data.frames
d3 = merge(d1c, d2c, by=c("id","ptnum"), all=TRUE)

-

Заключительные мысли: моей мотивацией для этого вопроса было узнать об альтернативах пакету reshape, кроме функции stats :: reshape. На данный момент я пришел к следующим выводам:

  • Придерживайтесь stats :: reshape, когда можете. Пока вы не забываете использовать список, а не простой вектор для аргумента «варьируемость», вы избежите проблем. Для небольших наборов данных - несколько тысяч случаев пациентов с менее чем 200 переменными в сумме - это то, с чем я имел дело в этот раз - более низкая скорость этой функции стоит простоты кода.

  • Чтобы использовать подход cast / melt в пакете reshape (или reshape2) Хэдли Уикхема, вы должны разделить свои переменные на два набора, один из которых состоит из числовых переменных, а другой - из символьных переменных. Когда ваш набор данных достаточно велик, что вы сочтете stats :: reshape невыносимым, я полагаю, что дополнительный шаг по разделению ваших переменных на два набора не будет казаться таким уж плохим.

5
задан Krishna Tateneni 7 June 2013 в 18:03
поделиться