إعادة تشكيل إطار البيانات لتحويل العوامل إلى أعمدة في ص
سؤال
لدي إطار بيانات حيث يوجد عمود معين مجموعة من القيم المحددة (دعنا نقول، 1، 2، ...، 23). ما أود القيام به هو التحويل من هذا التصميم إلى واحد، حيث سيكون للإطار 23 عملا إضافيا (في هذه الحالة)، كل واحد يمثل أحد قيم العامل. ستكون البيانات الموجودة في هذه الأعمدة من المنطقيين الذين يشيرون إلى ما إذا كان صف معين لديه قيمة عامل معين ... لإظهار مثال محدد:
إطار المصدر:
ID DATE SECTOR
123 2008-01-01 1
456 2008-01-01 3
789 2008-01-02 5
... <more records with SECTOR values from 1 to 5>
التنسيق المطلوب:
ID DATE SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5
123 2008-01-01 T F F F F
456 2008-01-01 F F T F F
789 2008-01-02 F F F F T
ليس لدي مشكلة في القيام بذلك في حلقة ولكني آمل أن تكون هناك طريقة أفضل. بعيد جدا reshape()
لم تسفر عن النتيجة المرجوة. ستكون المساعدة موضع تقدير كبير.
المحلول
أود أن أحاول ربط عمود آخر يسمى "القيمة" وتعيين value = TRUE
.
df <- data.frame(cbind(1:10, 2:11, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
df <- data.frame(df, value=TRUE)
ثم قم بإعادة تشكيل:
reshape(df, idvar=c("ID","DATE"), timevar="SECTOR", direction="wide")
المشكلة مع استخدام reshape
الوظيفة هي أن الافتراضي للقيم المفقودة هو NA (في هذه الحالة، سيتعين عليك تكرارها واستبدالها بطريقة خاطئة).
وإلا يمكنك استخدام cast
خارج ال reshape
صفقة (انظر هذا السؤال للحصول على مثال)، وتعيين الافتراضي ل FALSE
.
df.wide <- cast(df, ID + DATE ~ SECTOR, fill=FALSE)
> df.wide
ID DATE 1 2 3
1 1 2 TRUE FALSE FALSE
2 2 3 FALSE TRUE FALSE
3 3 4 FALSE FALSE TRUE
4 4 5 TRUE FALSE FALSE
5 5 6 FALSE TRUE FALSE
6 6 7 FALSE FALSE TRUE
7 7 8 TRUE FALSE FALSE
8 8 9 FALSE TRUE FALSE
9 9 10 FALSE FALSE TRUE
10 10 11 TRUE FALSE FALSE
نصائح أخرى
هنا نهج آخر باستخدام xtabs
والتي قد تكون أو لا تكون أسرع (إذا حاول شخص ما وأخبرني بذلك):
df <- data.frame(cbind(1:12, 2:13, 1:3))
colnames(df) <- c("ID","DATE","SECTOR")
foo <- xtabs(~ paste(ID, DATE) + SECTOR, df)
cbind(t(matrix(as.numeric(unlist(strsplit(rownames(foo), " "))), nrow=2)), foo)