it-swarm.asia

كيف يمكنني حذف الصفوف في إطار البيانات؟

لدي إطار بيانات باسم "mydata" يبدو كالتالي:

   A  B  C   D 
1. 5  4  4   4 
2. 5  4  4   4 
3. 5  4  4   4 
4. 5  4  4   4 
5. 5  4  4   4 
6. 5  4  4   4 
7. 5  4  4   4 

أود حذف الصف 2،4،6. على سبيل المثال ، مثل هذا:

   A  B  C   D
1. 5  4  4  4 
3. 5  4  4  4 
5. 5  4  4  4 
7. 5  4  4  4 
181
R newbie

الفكرة الأساسية هي تشكيل مجموعة من الصفوف التي تريد إزالتها ، والحفاظ على مكمل هذه المجموعة.

في R ، يتم إعطاء تكملة مجموعة بواسطة المشغل '-'.

لذلك ، بافتراض أن الرمز data.frame يسمى myData:

myData[-c(2, 4, 6), ]   # notice the -

بالطبع ، لا تنسَ "إعادة تعيين" myData إذا كنت تريد إسقاط تلك الصفوف بالكامل --- وإلا ، فإن R يطبع النتائج فقط.

myData <- myData[-c(2, 4, 6), ]
279
A5C1D2H2I1M1N2O1R2T1

يمكنك أيضًا العمل مع متجه منطقي يسمى الملقب logical:

row_to_keep = c(TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE)
myData = myData[row_to_keep,]

لاحظ أن عامل التشغيل ! يعمل كـ NOT ، أي !TRUE == FALSE:

myData = myData[!row_to_keep,]

يبدو هذا مرهقًا بعض الشيء مقارنة بإجابة @ mrwab (+1 راجع للشغل :)) ، ولكن يمكن إنشاء ناقل منطقي سريعًا ، على سبيل المثال حيث تتجاوز قيمة العمود قيمة معينة:

myData = myData[myData$A > 4,]
myData = myData[!myData$A > 4,] # equal to myData[myData$A <= 4,]

يمكنك تحويل المتجه المنطقي إلى متجه من المؤشرات:

row_to_keep = which(myData$A > 4)

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

myData$A[myData$A > 4,] <- NA

حيث يتم تعيين العمود ANA (وليس رقمًا) حيث يتجاوز A 4.

68
Paul Hiemstra

مشاكل مع الحذف عن طريق رقم الصف

لتحليلات سريعة وقذرة ، يمكنك حذف صفوف من data.frame حسب العدد حسب الإجابة العليا. أي.،

newdata <- myData[-c(2, 4, 6), ] 

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

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

استراتيجية أفضل

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

newdata <- myData[ !(myData$id %in% c(2,4,6)), ]

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

46
Jeromy Anglim

قم بإنشاء عمود معرف في إطار البيانات الخاص بك أو استخدم أي اسم عمود لتحديد الصف. استخدام الفهرس ليس عادلاً للحذف.

استخدم دالة subset لإنشاء إطار جديد.

updated_myData <- subset(myData, id!= 6)
print (updated_myData)

updated_myData <- subset(myData, id %in% c(1, 3, 5, 7))
print (updated_myData)
8
Paranthaman Ramakrishnan

عن طريق تسلسل مبسط:

mydata[-(1:3 * 2), ]

بالتسلسل:

mydata[seq(1, nrow(mydata), by = 2) , ]

بالتسلسل السلبي:

mydata[-seq(2, nrow(mydata), by = 2) , ]

أو إذا كنت تريد تعيين مجموعة فرعية عن طريق تحديد الأرقام الفردية:

mydata[which(1:nrow(mydata) %% 2 == 1) , ]

أو إذا كنت تريد تعيين مجموعة فرعية عن طريق تحديد أرقام فردية ، الإصدار 2:

mydata[which(1:nrow(mydata) %% 2 != 0) , ]

أو إذا كنت ترغب في مجموعة فرعية عن طريق تصفية الأرقام الزوجية:

mydata[!which(1:nrow(mydata) %% 2 == 0) , ]

أو إذا كنت ترغب في تعيين فرعي عن طريق تصفية الأرقام الزوجية ، الإصدار 2:

mydata[!which(1:nrow(mydata) %% 2 != 1) , ]
6
Elías De La Rosa

حذف Dan من employee.data - لا حاجة لإدارة إطار بيانات جديد.

employee.data <- subset(employee.data, name!="Dan")
0
SQLWolfe

إليك وظيفة سريعة وقذرة لإزالة صف حسب الفهرس.

removeRowByIndex <- function(x, row_index) {
  nr <- nrow(x)
  if (nr < row_index) {
    print('row_index exceeds number of rows')
  } else if (row_index == 1)
  {
    return(x[2:nr, ])
  } else if (row_index == nr) {
    return(x[1:(nr - 1), ])
  } else {
    return (x[c(1:(row_index - 1), (row_index + 1):nr), ])
  }
}

إنه العيب الرئيسي هو أن حجة row_index لا تتبع نمط R كونها متجه للقيم. قد تكون هناك مشكلات أخرى حيث قضيت بضع دقائق فقط في كتابتها واختبارها ، وبدأت فقط في استخدام R في الأسابيع القليلة الماضية. أي تعليقات والتحسينات على هذا سيكون موضع ترحيب كبير!

0
Alan Carlyle