إعادة تشكيل إطار البيانات لتحويل العوامل إلى أعمدة في ص

StackOverflow https://stackoverflow.com/questions/2404085

  •  18-09-2019
  •  | 
  •  

سؤال

لدي إطار بيانات حيث يوجد عمود معين مجموعة من القيم المحددة (دعنا نقول، 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)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top