العوامل في R: أكثر من إزعاج؟




language-design internals (5)

أحد أنواع البيانات الأساسية في R هو العوامل. في تجربتي عوامل هي أساسا الألم وأنا لم أستخدمها أبدا. أنا دائما تحويل إلى شخصيات. أشعر بغرابة وكأنني فقد شيء ما.

هل توجد بعض الأمثلة الهامة للوظائف التي تستخدم عوامل كمتغيرات تجميع حيث يصبح نوع بيانات العامل ضروريًا؟ هل هناك ظروف محددة عندما أستخدم العوامل؟


العوامل هي محرك badging "الحالات الفريدة" ممتازة. لقد أعدت هذا بشكل سيئ عدة مرات ، وعلى الرغم من بعض التجاعيد في بعض الأحيان ، فهي قوية للغاية.

library(dplyr)
d <- tibble(x = sample(letters[1:10], 20, replace = TRUE))

## normalize this table into an indexed value across two tables
id <- tibble(x_u = sort(unique(d$x))) %>% mutate(x_i = row_number())
di <- tibble(x_i = as.integer(factor(d$x)))


## reconstruct d$x when needed
d2 <- inner_join(di, id) %>% transmute(x = x_u)
identical(d, d2)
## [1] TRUE

إذا كان هناك طريقة أفضل للقيام بهذه المهمة ، فأنا أحب أن أراها ، وأنا لا أرى هذه القدرة على factor المناقشة.


تعتبر العوامل رائعة عند إجراء تحليل إحصائي واستكشاف البيانات فعليًا. ومع ذلك ، وقبل ذلك ، عندما يكون المرء يقرأ ، والتنظيف ، واستكشاف الأخطاء وإصلاحها ، ودمج البيانات ومعالجتها بشكل عام ، فإن العوامل تشكل ألمًا إجماليًا. وفي الآونة الأخيرة ، كما في السنوات القليلة الماضية ، تحسنت الكثير من الوظائف للتعامل مع العوامل بشكل أفضل. على سبيل المثال ، يلعب rbind بشكل جيد معهم. ما زلت أجد إزعاجًا تامًا لتركنا مستويات فارغة بعد وظيفة فرعية.

#drop a whole bunch of unused levels from a whole bunch of columns that are factors using gdata
require(gdata)
drop.levels(dataframe)

أعلم أنه من السهل إعادة صياغة مستويات عامل وإعادة ترتيب التسميات ، وهناك أيضًا طرق رائعة لإعادة ترتيب المستويات. عقلي لا يستطيع أن يتذكرها وعليّ أن أتعلمها في كل مرة أستخدمها. يجب أن يكون الترميز أسهل بكثير مما هو عليه.

وظائف سلسلة R هي سهلة جدا ومنطقية للاستخدام. لذا عندما أتلاعب ، أفضّل عمومًا الأحرف على العوامل.


هناك factor شبيه إلى حد ما بالنوع المكرر باللغات الأخرى. الاستخدام المناسب هو لمتغير لا يمكن أن يأخذ سوى مجموعة من القيم المحددة. في هذه الحالات ، قد لا تكون كل القيم الممكنة المسموح بها موجودة في أي مجموعة معينة من البيانات وتعكس المستويات "الفارغة" ذلك بدقة.

النظر في بعض الأمثلة. بالنسبة لبعض البيانات التي تم جمعها في جميع أنحاء الولايات المتحدة ، ينبغي تسجيل الدولة كعامل. في هذه الحالة ، فإن حقيقة عدم جمع أي حالة من حالة معينة ذات صلة. كان يمكن أن تكون هناك بيانات من تلك الحالة ، ولكن حدث (لأي سبب ، والذي قد يكون سببًا للاهتمام) ألا يكون. إذا تم جمع مسقط ، فإنه لن يكون عاملا. لا توجد مجموعة مسبقة من مسقط رأس ممكن. إذا تم جمع البيانات من ثلاث بلدات بدلاً من جمعها على المستوى الوطني ، فستكون المدينة عاملاً: هناك ثلاثة خيارات تم تقديمها في البداية وإذا لم يتم العثور على حالات / بيانات ذات صلة في إحدى هذه المدن الثلاث ، فإن ذلك مناسب.

الجوانب الأخرى factor ، مثل توفير طريقة لإعطاء ترتيب فرز عشوائي لمجموعة من السلاسل ، هي خصائص ثانوية مفيدة factor s ، ولكنها ليست السبب لوجودها.


يا له من عنوان snarky!

أعتقد أن العديد من وظائف التقدير تسمح لك باستخدام عوامل لتحديد المتغيرات الوهمية بسهولة ... لكنني لا أستخدمها لذلك.

أستخدمها عندما يكون لدي متجهات ذات طابع كبير جدًا مع بعض الملاحظات الفريدة. هذا يمكن أن يقلل استهلاك الذاكرة ، خاصة إذا كانت السلاسل في متجه الأحرف أطول.

PS - أنا أمزح حول العنوان. رأيت تغريدة الخاص بك. ؛-)


يجب عليك استخدام العوامل. نعم يمكن أن يكون الألم ، ولكن نظريتي هي أن 90 ٪ من سبب الألم هو أنه في read.table و read.csv ، فإن read.csv stringsAsFactors = TRUE افتراضيا (ومعظم المستخدمين يفتقدون هذه الدقة). أقول أنها مفيدة لأن حزم تركيب النماذج مثل عوامل الاستخدام lme4 وعوامل مرتبة إلى نماذج تناسب بشكل مختلف وتحديد نوع التناقضات التي يجب استخدامها. كما تستخدم حزم الرسوم البيانية أيضًا للتجمع حسب. ggplot ومعظم وظائف نموذج تركيب ناقلات الطابع ggplot للعوامل ، وبالتالي فإن النتيجة هي نفسها. ومع ذلك ، ينتهي بك الأمر بتحذيرات في شفرتك:

lm(Petal.Length ~ -1 + Species, data=iris)

# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris)

# Coefficients:
#     Speciessetosa  Speciesversicolor   Speciesvirginica  
#             1.462              4.260              5.552  

iris.alt <- iris
iris.alt$Species <- as.character(iris.alt$Species)
lm(Petal.Length ~ -1 + Species, data=iris.alt)

# Call:
# lm(formula = Petal.Length ~ -1 + Species, data = iris.alt)

# Coefficients:
#     Speciessetosa  Speciesversicolor   Speciesvirginica  
#             1.462              4.260              5.552  

رسالة التحذير: في model.matrix.default(mt, mf, contrasts) :

Species المتغيرة المحولة إلى factor

شيء واحد صعب هو drop=TRUE كامل drop=TRUE بت. في المتجهات ، يعمل هذا بشكل جيد لإزالة مستويات العوامل غير الموجودة في البيانات. فمثلا:

s <- iris$Species
s[s == 'setosa', drop=TRUE]
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa
s[s == 'setosa', drop=FALSE]
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica

ومع ذلك ، باستخدام data.frame s ، data.frame سلوك [.data.frame() : راجع هذا البريد الإلكتروني أو ?"[.data.frame" . باستخدام drop=TRUE على data.frame s لا يعمل كما تتخيل:

x <- subset(iris, Species == 'setosa', drop=TRUE)  # susbetting with [ behaves the same way
x$Species
#  [1] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [11] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [21] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [31] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# [41] setosa setosa setosa setosa setosa setosa setosa setosa setosa setosa
# Levels: setosa versicolor virginica

لحسن الحظ يمكنك إسقاط العوامل بسهولة مع droplevels() لإسقاط مستويات العوامل غير المستخدمة لعامل فردي أو لكل عامل في data.frame (منذ R 2.12):

x <- subset(iris, Species == 'setosa')
levels(x$Species)
# [1] "setosa"     "versicolor" "virginica" 
x <- droplevels(x)
levels(x$Species)
# [1] "setosa"

هذه هي الطريقة للحفاظ على المستويات التي اخترتها من الحصول على أساطير ggplot .

داخليًا ، يكون factor s عبارة عن أعداد صحيحة مع متجه حرف مميز على مستوى السمة (راجع attributes(iris$Species) class(attributes(iris$Species)$levels) ) ، وهو نظيف. إذا كان عليك تغيير اسم مستوى (وكنت تستخدم سلاسل الأحرف) ، فستكون هذه العملية أقل كفاءة بكثير . وأنا أغير أسماء المستوى كثيرًا ، خاصةً بالنسبة إلى أساطير ggplot . إذا كنت تزييف عوامل مع متجهات الشخصيات ، فهناك خطر أنك ستقوم بتغيير عنصر واحد فقط ، وإنشاء مستوى جديد منفصل عن طريق الخطأ.





r-factor