r - إعادة ترتيب مستويات عامل بدون تغيير ترتيب القيم




levels (5)

أود إضافة حالة أخرى حيث يمكن أن تكون المستويات سلاسل تحمل أرقامًا مع بعض الأحرف الخاصة: مثل المثال أدناه

df <- data.frame(x = c("15-25", "0-4", "5-10", "11-14", "100+"))

المستويات الافتراضية لـ x هي:

df$x
# [1] 15-25 0-4   5-10  11-14 100+ 
# Levels: 0-4 100+ 11-14 15-25 5-10

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

library(gtools)
df$x <- factor(df$x, levels = mixedsort(df$x))

df$x
# [1] 15-25 0-4   5-10  11-14 100+ 
# Levels: 0-4 5-10 11-14 15-25 100+
as.numeric(df$x)
# [1] 4 1 2 3 5

آمل أن يكون هذا بمثابة معلومات مفيدة للقراء في المستقبل.

لدي إطار بيانات مع بعض المتغيرات العددية وبعض متغيرات factor الفئوية. ترتيب المستويات لتلك العوامل ليس بالطريقة التي أريدها بها.

numbers <- 1:4
letters <- factor(c("a", "b", "c", "d"))
df <- data.frame(numbers, letters)
df
#   numbers letters
# 1       1       a
# 2       2       b
# 3       3       c
# 4       4       d

إذا قمت بتغيير ترتيب المستويات ، فإن الحروف لم تعد مع الأرقام المقابلة لها (بياناتي هي كلام فارغ من هذه النقطة).

levels(df$letters) <- c("d", "c", "b", "a")
df
#   numbers letters
# 1       1       d
# 2       2       c
# 3       3       b
# 4       4       a

أرغب ببساطة في تغيير ترتيب المستوى ، لذلك عند التخطيط ، تظهر القضبان بالترتيب المطلوب - والذي قد يختلف عن الترتيب الأبجدي الافتراضي.


استخدم حجة levels factor :

df <- data.frame(f = 1:4, g = letters[1:4])
df
#   f g
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d

levels(df$g)
# [1] "a" "b" "c" "d"

df$g <- factor(df$g, levels = letters[4:1])
# levels(df$g)
# [1] "d" "c" "b" "a"

df
#   f g
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d

بعض أكثر ، فقط للتسجيل

## reorder is a base function
df$letters <- reorder(df$letters, new.order=letters[4:1])

library(gdata)
df$letters <- reorder.factor(df$letters, letters[4:1])

قد تجد أيضا مفيدة Relevel و combine_factor .


لذلك ما تريده ، في معجم R ، هو تغيير العلامات فقط لمتغير عامل معين (أي ترك البيانات وكذلك مستويات العوامل ، دون تغيير).

df$letters = factor(df$letters, labels=c("d", "c", "b", "a"))

نظرًا لأنك ترغب في تغيير تعيين مخطط البيانات إلى التسمية فقط وليس البيانات أو مخطط العوامل (كيف يتم حفظ نقاط البيانات في صناديق فردية أو قيم العوامل ، قد يساعد ذلك في معرفة كيفية تعيين التعيين في الأصل عند إنشاء العامل.

القواعد بسيطة:

  • يتم تعيين الملصقات إلى مستويات حسب قيمة المؤشر (على سبيل المثال ، يتم إعطاء القيمة عند المستويات [2] التسمية ، التسمية [2]) ؛
  • يمكن تعيين مستويات العوامل بشكل صريح عن طريق تمريرها عبر وسيطة المستويات ؛ أو
  • إذا لم يتم توفير قيمة لوسيطة مستويات ، يتم استخدام القيمة الافتراضية التي هي نتيجة الاستدعاء الفريدة على متجه البيانات التي تم تمريرها (لوسيطة البيانات ) ؛
  • يمكن تعيين التصنيفات بشكل صريح عبر وسيطة التصنيفات ؛ أو
  • إذا لم يتم توفير قيمة لوسيطة الملصقات ، فسيتم استخدام القيمة الافتراضية وهي عبارة عن مستويات المتجه

وبما أن هذا السؤال كان نشطًا في الماضي ، فقد أصدر هادلي حزمة forcats الجديدة للتلاعب في العوامل forcats مفيدة بشكل شنيع. أمثلة من إطار بيانات OP:

levels(df$letters)
# [1] "a" "b" "c" "d"

لعكس المستويات:

library(forcats)
fct_rev(df$letters) %>% levels
# [1] "d" "c" "b" "a"

لإضافة المزيد من المستويات:

fct_expand(df$letters, "e") %>% levels
# [1] "a" "b" "c" "d" "e"

والعديد من وظائف fct_xxx() أكثر فائدة.





levels