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




dataframe r-faq (11)

آخر dplyr الجواب. إذا كانت المتغيرات الخاصة بك تحتوي على بنية تسمية شائعة ، فيمكنك محاولة starts_with() . فمثلا

library(dplyr)
df <- data.frame(var1 = rnorm(5), var2 = rnorm(5), var3 = rnorm (5), 
                 var4 = rnorm(5), char1 = rnorm(5), char2 = rnorm(5))
df
#        var2      char1        var4       var3       char2       var1
#1 -0.4629512 -0.3595079 -0.04763169  0.6398194  0.70996579 0.75879754
#2  0.5489027  0.1572841 -1.65313658 -1.3228020 -1.42785427 0.31168919
#3 -0.1707694 -0.9036500  0.47583030 -0.6636173  0.02116066 0.03983268
df1 <- df %>% select(-starts_with("char"))
df1
#        var2        var4       var3       var1
#1 -0.4629512 -0.04763169  0.6398194 0.75879754
#2  0.5489027 -1.65313658 -1.3228020 0.31168919
#3 -0.1707694  0.47583030 -0.6636173 0.03983268

إذا كنت تريد إسقاط تسلسل متغيرات في إطار البيانات ، فيمكنك استخدام : على سبيل المثال ، إذا كنت تريد إسقاط var2 و var3 وكل المتغيرات بينهما ، فسيتم var1 مع var1 :

df2 <- df1 %>% select(-c(var2:var3) )  
df2
#        var1
#1 0.75879754
#2 0.31168919
#3 0.03983268

لدي عدد من الأعمدة التي أود إزالتها من إطار البيانات. أعلم أنه يمكننا حذفها بشكل فردي باستخدام شيء مثل:

df$x <- NULL

لكنني كنت آمل أن أفعل ذلك مع عدد أقل من الأوامر.

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

df <- df[ -c(1, 3:6, 12) ]

لكنني قلق من أن الوضع النسبي لمتغيراتي قد يتغير.

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


أشك في هذا سيحصل على الكثير من الاهتمام هنا ، ولكن إذا كان لديك قائمة من الأعمدة التي تريد إزالتها ، وتريد أن تفعل ذلك في سلسلة one_of() أستخدم one_of() في جملة select :

في ما يلي مثال بسيط وقابل للتكرار:

undesired <- c('mpg', 'cyl', 'hp')

mtcars %>%
  select(-one_of(undesired))

يمكن العثور على الوثائق عن طريق تشغيل ?one_of أو هنا:

http://genomicsclass.github.io/book/pages/dplyr_tutorial.html


إذا كنت تريد إزالة الأعمدة حسب المرجع وتجنب النسخ الداخلي المرتبط بـ data.frames فيمكنك استخدام حزمة data.table والدالة :=

يمكنك تمرير أسماء متجه الأحرف إلى الجانب الأيسر من := عامل التشغيل ، و NULL كـ RHS.

library(data.table)

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)
# or more simply  DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10) #

DT[, c('a','b') := NULL]

إذا كنت ترغب في تحديد الأسماء مسبقًا على أنها متجه الحرف خارج استدعاء [ ، قم بتغليف اسم الكائن في () أو {} لإجبار تقييم LHS في نطاق الاتصال ليس كاسم ضمن نطاق DT .

del <- c('a','b')
DT <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, (del) := NULL]
DT <-  <- data.table(a=1:10, b=1:10, c=1:10, d=1:10)
DT[, {del} := NULL]
# force or `c` would also work.   

يمكنك أيضًا استخدام set ، التي تتجنب زيادة الحمل [.data.table ، وتعمل أيضًا مع البيانات. data.frames !

df <- data.frame(a=1:10, b=1:10, c=1:10, d=1:10)
DT <- data.table(df)

# drop `a` from df (no copying involved)

set(df, j = 'a', value = NULL)
# drop `b` from DT (no copying involved)
set(DT, j = 'b', value = NULL)

امكانية اخرى:

df <- df[, setdiff(names(df), c("a", "c"))]

أو

df <- df[, grep('^(a|c)$', names(df), invert=TRUE)]

قائمة (NULL) كما يعمل:

dat <- mtcars
colnames(dat)
# [1] "mpg"  "cyl"  "disp" "hp"   "drat" "wt"   "qsec" "vs"   "am"   "gear"
# [11] "carb"
dat[,c("mpg","cyl","wt")] <- list(NULL)
colnames(dat)
# [1] "disp" "hp"   "drat" "qsec" "vs"   "am"   "gear" "carb"

من الفائدة ، هذه الأعلام حتى واحدة من التناقضات غوي بناء الجملة غريبة. على سبيل المثال ، يتم عرض إطار بيانات مكون من عمودين:

df <- data.frame(x=1, y=2)

هذا يعطي إطار البيانات

subset(df, select=-y)

ولكن هذا يعطي ناقلات

df[,-2]

هذا هو كل ما هو موضح في ?[ ولكن ليس بالضبط السلوك المتوقع. حسنا على الأقل ليس بالنسبة لي ...


هناك أيضًا أمر subset ، مفيد إذا كنت تعرف الأعمدة التي تريدها:

df <- data.frame(a = 1:10, b = 2:11, c = 3:12)
df <- subset(df, select = c(a, c))

تم التحديث بعد التعليق بواسطةhadley: لإسقاط الأعمدة a، c يمكنك القيام بما يلي:

df <- subset(df, select = -c(a, c))

هناك إستراتيجية أكثر قوة يمكن الاعتماد عليها استنادًا إلى حقيقة أن grep () ستعيد متجهًا رقميًا. إذا كان لديك قائمة طويلة من المتغيرات كما أفعل في إحدى مجموعات البيانات الخاصة بي ، فإن بعض المتغيرات تنتهي بـ ".A" وغيرها التي تنتهي بـ ".B" وتريد فقط تلك التي تنتهي بـ ".A" (على طول مع جميع المتغيرات التي لا تطابق أيًا من النمطين ، قم بما يلي:

dfrm2 <- dfrm[ , -grep("\\.B$", names(dfrm)) ]

بالنسبة للحالة المطروحة ، باستخدام مثال Joris Meys ، قد لا يكون مضغوطًا ، ولكن سيكون:

DF <- DF[, -grep( paste("^",drops,"$", sep="", collapse="|"), names(DF) )]

يمكنك استخدام %in% مثل هذا:

df[, !(colnames(df) %in% c("x","bar","foo"))]

يمكنك استخدام قائمة بسيطة من الأسماء:

DF <- data.frame(
  x=1:10,
  y=10:1,
  z=rep(5,10),
  a=11:20
)
drops <- c("x","z")
DF[ , !(names(DF) %in% drops)]

أو ، بدلاً من ذلك ، يمكنك إنشاء قائمة بتلك الاحتفاظ بها والإشارة إليها بالاسم:

keeps <- c("y", "a")
DF[keeps]

تعديل: لأولئك الذين لا يزالون غير مطلعين على الوسيطة drop لوظيفة الفهرسة ، إذا كنت تريد الاحتفاظ بعمود واحد كإطار بيانات ، فعليك القيام بما يلي:

keeps <- "y"
DF[ , keeps, drop = FALSE]

drop=TRUE (أو عدم ذكرها) سيؤدي إلى تقليل الأبعاد غير الضرورية ، وبالتالي إرجاع متجه مع قيم العمود y .


within(df, rm(x))

ربما يكون أسهل ، أو لمتغيرات متعددة:

within(df, rm(x, y))

أو إذا كنت تتعامل مع data.table s (لكل كيف تقوم بحذف عمود بالاسم في data.table؟ ):

dt[, x := NULL]   # deletes column x by reference instantly

dt[, !"x", with=FALSE]   # selects all but x into a new data.table

أو لمتغيرات متعددة

dt[, c("x","y") := NULL]

dt[, !c("x", "y"), with=FALSE]

في إصدار تطوير data.table ( إرشادات التثبيت ) ، with = FALSE لم تعد ضرورية:

dt[ , !"x"]
dt[ , !c("x", "y")]






r-faq