Функции плавления / литья в пакете 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 невыносимым, я полагаю, что дополнительный шаг по разделению ваших переменных на два набора не будет казаться таким уж плохим.