سؤال

أواجه بعض المشاكل مع البائعين الرائدة زائدة بيضاء في البيانات.الإطار.على سبيل المثال أحب أن نلقي نظرة على معين row في data.frame بناء على شرط معين:

> myDummy[myDummy$country == c("Austria"),c(1,2,3:7,19)] 

[1] codeHelper     country        dummyLI    dummyLMI       dummyUMI       
[6] dummyHInonOECD dummyHIOECD    dummyOECD      
<0 rows> (or 0-length row.names)

كنت أتساءل لماذا لم تحصل على النتائج المنتظرة منذ البلد النمسا الواضح موجودة في بلدي data.frame.بعد النظر من خلال رمز التاريخ و محاولة معرفة ما حدث من خطأ حاولت:

> myDummy[myDummy$country == c("Austria "),c(1,2,3:7,19)]
   codeHelper  country dummyLI dummyLMI dummyUMI dummyHInonOECD dummyHIOECD
18        AUT Austria        0        0        0              0           1
   dummyOECD
18         1

كل ما تغير في الأمر إضافية بيضاء بعد النمسا.

مزيد من المشاكل المزعجة ومن الواضح أن تنشأ.على سبيل المثال عندما ترغب في دمج اثنين من إطارات على أساس البلد العمود.واحد data.frame يستخدم "Austria " في حين أن الآخر لديه الإطار "Austria".مطابقة لا يعمل.

  1. هل هناك طريقة لطيفة إلى 'عرض' بيضاء على الشاشة بحيث أنا على بينة من هذه المشكلة ؟
  2. و يمكنني إزالة البائعين الرائدة زائدة بيضاء في "ص" ؟

حتى الآن اعتدت أن أكتب بسيط Perl السيناريو الذي يزيل بيضاء ولكن سيكون من الرائع إذا كنت يمكن أن تفعل ذلك بطريقة أو بأخرى داخل R.

هل كانت مفيدة؟

المحلول

ربما أفضل طريقة للتعامل مع زائدة whitespaces عند قراءة ملف البيانات الخاص بك.إذا كنت تستخدم read.csv أو read.table يمكنك تعيين المعلمةstrip.white=TRUE.

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

# returns string w/o leading whitespace
trim.leading <- function (x)  sub("^\\s+", "", x)

# returns string w/o trailing whitespace
trim.trailing <- function (x) sub("\\s+$", "", x)

# returns string w/o leading or trailing whitespace
trim <- function (x) gsub("^\\s+|\\s+$", "", x)

استخدام واحدة من هذه الوظائف على myDummy$country:

 myDummy$country <- trim(myDummy$country)

'إظهار' بيضاء هل يمكن استخدام:

 paste(myDummy$country)

والتي سوف تظهر لك سلاسل محاطا بعلامات اقتباس (") جعل whitespaces أسهل على الفور.

نصائح أخرى

كما R 3.2.0 تم تقديم وظيفة جديدة لإزالة الرائدة/زائدة whitespaces:

trimws()

انظر: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html

إلى التعامل مع مساحة بيضاء, استخدام str_trim() في stringr الحزمة.حزمة دليل مؤرخ فبراير 15,2013 و هو في كران.وظيفة يمكن أيضا التعامل مع سلسلة النواقل.

install.packages("stringr", dependencies=TRUE)
require(stringr)
example(str_trim)
d4$clean2<-str_trim(d4$V2)

(الائتمان يذهب إلى المعلق:R.القطن)

بسيطة وظيفة لإزالة البائعين الرائدة زائدة بيضاء:

trim <- function( x ) {
  gsub("(^[[:space:]]+|[[:space:]]+$)", "", x)
}

الاستخدام:

> text = "   foo bar  baz 3 "
> trim(text)
[1] "foo bar  baz 3"

ad1) لمعرفة المساحات البيضاء يمكنك الاتصال مباشرة print.data.frame مع تعديل الحجج:

print(head(iris), quote=TRUE)
#   Sepal.Length Sepal.Width Petal.Length Petal.Width  Species
# 1        "5.1"       "3.5"        "1.4"       "0.2" "setosa"
# 2        "4.9"       "3.0"        "1.4"       "0.2" "setosa"
# 3        "4.7"       "3.2"        "1.3"       "0.2" "setosa"
# 4        "4.6"       "3.1"        "1.5"       "0.2" "setosa"
# 5        "5.0"       "3.6"        "1.4"       "0.2" "setosa"
# 6        "5.4"       "3.9"        "1.7"       "0.4" "setosa"

انظر أيضا ?print.data.frame عن خيارات أخرى.

استخدام البقرى أو grepl العثور على الملاحظات مع whitespaces ودون للتخلص منها.

names<-c("Ganga Din\t","Shyam Lal","Bulbul ")
grep("[[:space:]]+$",names)
[1] 1 3
grepl("[[:space:]]+$",names)
[1]  TRUE FALSE  TRUE
sub("[[:space:]]+$","",names)
[1] "Ganga Din" "Shyam Lal" "Bulbul"  

أنا أفضل أن إضافة الإجابة تعليق user56 ولكن لم يستطع حتى كتابة مستقلة الإجابة.إزالة البائعين الرائدة فراغات زائدة يمكن أن يتحقق من خلال تقليم() وظيفة من gdata حزمة:

require(gdata)
example(trim)

استخدام على سبيل المثال:

> trim("   Remove leading and trailing blanks    ")
[1] "Remove leading and trailing blanks"

وثمة خيار آخر هو استخدام stri_trim وظيفة من stringi الحزمة التي التخلف إلى إزالة البائعين الرائدة زائدة بيضاء:

> x <- c("  leading space","trailing space   ")
> stri_trim(x)
[1] "leading space"  "trailing space"

فقط إزالة الرائدة بيضاء, استخدام stri_trim_left.فقط إزالة زائدة بيضاء, استخدام stri_trim_right.عندما كنت ترغب في إزالة الرائدة الأخرى أو أحرف زائدة ، عليك أن تحدد ذلك مع pattern =.

انظر أيضا ?stri_trim للحصول على مزيد من المعلومات.

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

> a <- "  a string         with lots   of starting, inter   mediate and trailing   whitespace     "

ثم يمكنك بسهولة تقسيم هذه السلسلة إلى "ريال مدريد" الرموز باستخدام التعبير العادية إلى split الحجة:

> strsplit(a, split=" +")
[[1]]
 [1] ""           "a"          "string"     "with"       "lots"      
 [6] "of"         "starting,"  "inter"      "mediate"    "and"       
[11] "trailing"   "whitespace"

لاحظ أنه إذا كان هناك تطابق في بداية (غير فارغة) سلسلة العنصر الأول من إخراج '""', ولكن إذا كان هناك تطابق في نهاية السلسلة ، الناتج هو نفسه كما هو الحال مع مباراة إزالتها.

أنا خلقت trim.strings () وظيفة تقليم الرائدة و/أو زائدة بيضاء كما:

# Arguments:    x - character vector
#            side - side(s) on which to remove whitespace 
#                   default : "both"
#                   possible values: c("both", "leading", "trailing")

trim.strings <- function(x, side = "both") { 
    if (is.na(match(side, c("both", "leading", "trailing")))) { 
      side <- "both" 
      } 
    if (side == "leading") { 
      sub("^\\s+", "", x)
      } else {
        if (side == "trailing") {
          sub("\\s+$", "", x)
    } else gsub("^\\s+|\\s+$", "", x)
    } 
} 

من أجل التوضيح ،

a <- c("   ABC123 456    ", " ABC123DEF          ")

# returns string without leading and trailing whitespace
trim.strings(a)
# [1] "ABC123 456" "ABC123DEF" 

# returns string without leading whitespace
trim.strings(a, side = "leading")
# [1] "ABC123 456    "      "ABC123DEF          "

# returns string without trailing whitespace
trim.strings(a, side = "trailing")
# [1] "   ABC123 456" " ABC123DEF"   

أفضل طريقة trimws()

البرمجية التالية سوف تنطبق هذه الوظيفة بأكملها dataframe

mydataframe<- البيانات.الإطار(lapply(mydataframe, trimws),stringsAsFactors = FALSE)

حاولت trim().يعمل بشكل جيد مع المساحات البيضاء وكذلك ' '.x = ' هاردن ، ج. '

تقليم(x)

myDummy[myDummy$country == "Austria "] <- "Austria"

بعد هذا, سوف تحتاج إلى قوة R لا تعترف "النمسا" حسب المستوى.دعونا نتظاهر لديك أيضا "الولايات المتحدة الأمريكية" و "إسبانيا" حسب المستويات:

myDummy$country = factor(myDummy$country, levels=c("Austria", "USA", "Spain"))

قليلا أقل تهديدا من أعلى صوت الاستجابة ، ولكن يجب أن لا تزال تعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top