كيفية تقليم البائعين الرائدة زائدة بيضاء?
-
20-09-2019 - |
سؤال
أواجه بعض المشاكل مع البائعين الرائدة زائدة بيضاء في البيانات.الإطار.على سبيل المثال أحب أن نلقي نظرة على معين 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"
.مطابقة لا يعمل.
- هل هناك طريقة لطيفة إلى 'عرض' بيضاء على الشاشة بحيث أنا على بينة من هذه المشكلة ؟
- و يمكنني إزالة البائعين الرائدة زائدة بيضاء في "ص" ؟
حتى الآن اعتدت أن أكتب بسيط 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"))
قليلا أقل تهديدا من أعلى صوت الاستجابة ، ولكن يجب أن لا تزال تعمل.