व्हाट्सएप को अग्रणी और अनुगामी कैसे ट्रिम करें?


360

मुझे डेटा.फ्रेम में अग्रणी और अनुगामी व्हाट्सएप से कुछ परेशानी हो रही है। उदाहरण के लिए मैं एक विशिष्ट पर एक नज़र डालें चाहते 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. और क्या मैं R में अग्रणी और अनुगामी व्हाट्सएप को हटा सकता हूं?

अब तक मैं एक साधारण Perlस्क्रिप्ट लिखता था जो व्हाट्सएप को हटा देता था लेकिन यह अच्छा होगा यदि मैं इसे आर के अंदर कर सकूं।


1
मैंने अभी देखा कि संकेतन sub()का उपयोग करता है Perl। उसके लिए माफ़ करना। मैं फ़ंक्शन का उपयोग करने का प्रयास करने जा रहा हूं। लेकिन मेरे पहले सवाल के लिए मेरे पास अभी तक कोई हल नहीं है।
मृग

4
जैसा कि हैडली ने कहा था कि यह regex "^ \\ s + | \\ s + $" अग्रणी और अनुगामी व्हाट्सएप की पहचान करेगा। so x <- gsub ("^ \\ s + | \\ s + $", "", x) R के कई पढ़े गए कार्य इस विकल्प के रूप में हैं: strip.white = FALSE
Jay

जवाबों:


456

जब आप अपनी डेटा फ़ाइल पढ़ते हैं तो संभवत: सबसे अच्छा तरीका ट्रेलिंग व्हाट्सएप को संभालना है। यदि आप उपयोग करते हैं 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)

जो आपको उद्धरण चिह्नों (") से घिरा हुआ तार दिखाएगा, जिससे व्हाट्सएप को स्पॉट करना आसान हो जाएगा।


7
जैसा कि हैडली ने कहा था कि यह regex "^ \\ s + | \\ s + $" अग्रणी और अनुगामी व्हाट्सएप की पहचान करेगा। so x <- gsub ("^ \\ s + | \\ s + $", "", x) R के कई पढ़े गए कार्य इस विकल्प के रूप में हैं: strip.white = FALSE
Jay

50
पैकेज str_trimमें भी देखें stringr
रिची कॉटन

1
प्लस एक "ट्रिम फ़ंक्शन अब भविष्य के उपयोग के लिए संग्रहीत" के लिए - धन्यवाद!
क्रिस बीले

4
दुर्भाग्य से, पट्टी। सफेद = सही केवल गैर-उद्धृत स्ट्रिंग्स पर काम करता है।
रॉड्रिगो

2
आर 3.2.0 में व्हॉट्सएप ट्रिम करने का एक बहुत आसान तरीका है। अगला जवाब देखें!
एलेक्स

519

R 3.2.0 के रूप में अग्रणी / अनुगामी व्हाट्सएप को हटाने के लिए एक नया कार्य शुरू किया गया था:

trimws()

देखें: http://stat.ethz.ch/R-manual/R-patched/library/base/html/rrimws.html


2
यह एक सर्वोत्तम उत्तर की परिभाषा पर निर्भर करता है। यह उत्तर (+1) जानकर अच्छा लगा लेकिन एक त्वरित परीक्षण में, यह उतने ही तेज थे, जितने कि कुछ विकल्प थे।
A5C1D2H2I1M1N2O1R2T1

\nकवर लाइन वर्ग में होने के बावजूद मल्टी-लाइन स्ट्रिंग्स के लिए काम नहीं करता है । trimws("SELECT\n blah\n FROM foo;")अभी भी newlines शामिल हैं।
बुलबुले 15

6
@ बब्ल्स यह अपेक्षित व्यवहार है। स्ट्रिंग में आप ट्रिम करने के लिए गुजरते हैं कोई सफेद स्थान नहीं है या पीछे नहीं है। यदि आप स्ट्रिंग में प्रत्येक पंक्ति से अग्रणी और पीछे वाले सफेद रिक्त स्थान को निकालना चाहते हैं, तो आपको पहले इसे विभाजित करना होगा। इस तरह: ट्रिम्स (strsplit ("SELECT \ n blah \ n FROM foo?", "\ N") [[1]])
wligtenberg

1
हालांकि आर के हाल के संस्करणों के लिए एक अंतर्निहित फ़ंक्शन, यह हुड के नीचे एक 'पेरल स्टाइल रेगेक्स' करता है। मैंने ऐसा करने के लिए कुछ तेज कस्टम सी कोड की उम्मीद की होगी। हो सकता है कि trimwsरेगेक्स काफी तेज हो। stringr::str_trim(पर आधारित stringi) इस मायने में भी दिलचस्प है कि यह एक पूरी तरह से स्वतंत्र अंतर्राष्ट्रीयकृत स्ट्रिंग लाइब्रेरी का उपयोग करता है। आपको लगता है कि व्हाट्सएप अंतरराष्ट्रीयकरण के साथ समस्याओं से मुक्त होगा, लेकिन मुझे आश्चर्य है। मैंने कभी भी देशी बनाम stringr/ stringiया किसी भी मानक के परिणामों की तुलना नहीं देखी है ।
जैक वासे

किसी कारण से मैं इसका पता नहीं लगा सका, trimws()मेरे प्रमुख श्वेत स्थानों को नहीं हटाया, जबकि ब्रायन के trim.strings()नीचे (केवल 1 वोट, मेरा!) किया ...
पैट्रिक टी

89

सफेद स्थान में हेरफेर करने के लिए, स्ट्रिंग पैकेज में str_trim () का उपयोग करें। पैकेज में मैन्युअल दिनांक 15 फरवरी, 2012 और सीआरएएन है। फ़ंक्शन स्ट्रिंग वैक्टर को भी संभाल सकता है।

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

(क्रेडिट टिप्पणीकार को जाता है: आर। कॉटन)


2
इस समाधान ने कुछ उत्परिवर्ती व्हाट्सएप को हटा दिया जो trimws()हटाने में असमर्थ था।
रिचर्ड टेलफोर्ड

1
@RichardTelford क्या आप एक उदाहरण दे सकते हैं? क्योंकि इसे ट्रिम में बग माना जा सकता है।
wligtenberg

IMO यह सबसे अच्छा उपाय है। बहुत अधिक कोड और अत्यधिक प्रदर्शन करने वाला नहीं
पीटर

आवश्यकता के लिए धन्यवाद (स्ट्रिंग) उनके प्रलेखन या उदाहरणों में कोड की यह आवश्यक रेखा नहीं थी!
pgee70

23

व्हाट्सएप को अग्रणी और पीछे हटाने का एक सरल कार्य :

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

उपयोग:

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

11

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अन्य विकल्पों के लिए भी देखें ।


9

व्हाट्सएप और सब से छुटकारा पाने के लिए grep या grepl का उपयोग करें।

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"  

7
या, थोड़ा और "^\\s+|\\s+$"
सकुशल

4
बस इशारा करना चाहता था, कि हैडली के regexp के gsubबजाय एक का उपयोग करना होगा sub। इसके साथ subही
व्हॉट्सएप को

पता नहीं था कि आप perl = FALSE के साथ \ s आदि का उपयोग कर सकते हैं। डॉक्स का कहना है कि POSIX वाक्य रचना उस मामले में प्रयोग किया जाता है, लेकिन वाक्य रचना स्वीकार किए जाते हैं वास्तव में एक सुपरसेट TRE द्वारा परिभाषित regex पुस्तकालय है laurikari.net/tre/documentation/regex-syntax
ज्योतिर्मय भट्टाचार्य

5

मैं उपयोगकर्ता 56 पर टिप्पणी के रूप में उत्तर जोड़ना चाहूंगा, लेकिन अभी तक स्वतंत्र उत्तर के रूप में लिखने में असमर्थ हूं। प्रमुख और अनुगामी खाली को ट्रिम के माध्यम से प्राप्त किया जा सकता है () के रूप में अच्छी तरह से gdata पैकेज से कार्य:

require(gdata)
example(trim)

उपयोग उदाहरण:

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

5

यदि आपके पास एक से अधिक रिक्त स्थान inbetween इनपुट है, तो एक और संबंधित समस्या होती है:

> 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"

ध्यान दें कि यदि (गैर-खाली) स्ट्रिंग की शुरुआत में एक मैच होता है, तो आउटपुट का पहला तत्व '' '' '' है, लेकिन अगर स्ट्रिंग के अंत में एक मैच होता है, तो आउटपुट वैसा ही होता है। मैच के साथ हटा दिया गया।


5

एक अन्य विकल्प पैकेज 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अधिक जानकारी के लिए भी देखें ।


2

मैंने 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"   

1

सबसे अच्छा तरीका है ट्रिमेज ()

निम्नलिखित कोड इस फ़ंक्शन को संपूर्ण डेटाफ़्रेम पर लागू करेगा

mydataframe <- data.frame (lapply (mydataframe, ट्रिम), स्ट्रिंग्सएफ़एक्टर्स =ALSE)


या df[] <- lapply(df, trimws)अधिक कॉम्पैक्ट होने के लिए। लेकिन यह दोनों ही मामलों में चरित्र के लिए स्तंभों को मिलाएगा। df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)सुरक्षित रहने के लिए।
मूडी_मडस्किपर 20

1

मैंने ट्रिम () की कोशिश की। सफेद रिक्त स्थान के साथ-साथ '\ n' के साथ अच्छी तरह से काम करता है। x = '\ n हार्डन, जे। \ n'

ट्रिम (एक्स)


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

इसके बाद, आपको R को "ऑस्ट्रिया" को एक स्तर के रूप में नहीं पहचानने के लिए मजबूर करना होगा। आइए दिखाते हैं कि आपके पास "यूएसए" और "स्पेन" स्तर भी हैं:

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

उच्चतम मतदान की प्रतिक्रिया से थोड़ा कम डराना, लेकिन यह अभी भी काम करना चाहिए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.