কীভাবে শীর্ষস্থানীয় এবং অনুসরণকারী সাদা স্থান ট্রিম করবেন?


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

কমান্ডটিতে আমি যা কিছু পরিবর্তন করেছি তা হ'ল অস্ট্রিয়ার পরে একটি অতিরিক্ত সাদা জায়গা ace

স্পষ্টতই আরও বিরক্তিকর সমস্যা দেখা দেয়। যেমন আমি যখন দেশের কলামের উপর ভিত্তি করে দুটি ফ্রেম একত্রীকরণ করতে চাই। একটি অন্য ফ্রেমের data.frameব্যবহারের "Austria "সময় ব্যবহার করে "Austria"। মিলটি কাজ করে না।

  1. আমার স্ক্রিনে শ্বেত স্থানটি 'দেখানোর' জন্য কি কোনও দুর্দান্ত উপায় আছে যাতে আমি সমস্যাটি সম্পর্কে সচেতন হই?
  2. আর আমি কি আর এর অগ্রণী এবং অনুসরণীয় সাদা স্থানটি সরাতে পারি?

এখনও অবধি আমি একটি সাধারণ Perlস্ক্রিপ্ট লিখতাম যা শ্বেতস্থান সরিয়ে দেয় তবে আমি যদি কোনওভাবে আর এর ভিতরে এটি করতে পারি তবে এটি ভাল হবে would


1
আমি কেবল দেখেছি যে স্বরলিপি sub()ব্যবহার করে Perl। এর জন্যে দুঃখিত. আমি ফাংশনটি ব্যবহার করার চেষ্টা করতে যাচ্ছি। তবে আমার প্রথম প্রশ্নের জন্য আমার এখনও কোনও সমাধান নেই।
mropa

4
হ্যাডলি ইঙ্গিত হিসাবে এই রেজেক্স "^। S + |। S + $" নেতৃস্থানীয় এবং পিছনে হোয়াইটস্পেস সনাক্ত করবে। সুতরাং এক্স <- gsub ("^ \\ s + | \\ s + $", "", এক্স) আর এর অনেকগুলি পড়া ফাংশনগুলির এই বিকল্প হিসাবে রয়েছে: স্ট্রিপ.ভাইট = ফলস
জে

উত্তর:


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
হ্যাডলি ইঙ্গিত হিসাবে এই রেজেক্স "^। S + |। S + $" নেতৃস্থানীয় এবং পিছনে হোয়াইটস্পেস সনাক্ত করবে। সুতরাং এক্স <- gsub ("^ \\ s + | \\ s + $", "", এক্স) আর এর অনেকগুলি রিড ফাংশন এই বিকল্প হিসাবে রয়েছে: স্ট্রিপ.ভাইট = ফলস
জে

50
আরও দেখুন str_trimমধ্যে stringrপ্যাকেজ।
রিচি কটন

1
"ভবিষ্যতের ব্যবহারের জন্য এখন ট্রিম ফাংশন সংরক্ষণ করা হয়েছে" এর জন্য প্লাস ওয়ান - ধন্যবাদ!
ক্রিস বিলি

4
দুর্ভাগ্যক্রমে, স্ট্রিপ.হাইট = সত্য সত্যই কেবল অ-উদ্ধৃত স্ট্রিংগুলিতে কাজ করে।
রড্রিগো

2
আর 3.2.0 তে সাদা স্থান ছাঁটাই করার আরও একটি সহজ উপায় রয়েছে। পরবর্তী উত্তর দেখুন!
অ্যালেক্স

519

আরডি ৩.২.০ অনুসারে নেতৃস্থানীয় / পিছনের শ্বেত স্থানগুলি অপসারণের জন্য একটি নতুন ফাংশন চালু করা হয়েছিল:

trimws()

দেখুন: http://stat.ethz.ch/R-manual/R-patched/library/base/html/trimws.html


2
এটি একটি সেরা উত্তরের সংজ্ঞা উপর নির্ভর করে। এই উত্তরটি (+1) জেনে ভাল লাগছে তবে দ্রুত পরীক্ষায় এটি কিছু বিকল্প হিসাবে তত দ্রুত গতিতে ছিল না।
A5C1D2H2I1M1N2O1R2T1

\nকাভার্ড ক্যারেক্টার ক্লাসে থাকা সত্ত্বেও মাল্টি-লাইন স্ট্রিংয়ের জন্য কাজ করছে বলে মনে হচ্ছে না। trimws("SELECT\n blah\n FROM foo;")এখনও নিউলাইন রয়েছে।
জুবলস

6
@ জুবলস এটি প্রত্যাশিত আচরণ। স্ট্রিংয়ের মধ্যে আপনি ট্রিমগুলিতে চলে যান কোনও শীর্ষস্থানীয় বা পিছনের সাদা জায়গা নেই। আপনি যদি স্ট্রিংয়ের প্রতিটি লাইন থেকে শীর্ষস্থানীয় এবং অনুসরণযোগ্য সাদা স্পেসগুলি সরাতে চান তবে আপনাকে প্রথমে এটি বিভক্ত করতে হবে। এমন: trimws (strsplit ( "নির্বাচন করুন \ N বাজে \ N foo বিন্যাস থেকে;", "\ N") [[1]])
wligtenberg

1
যদিও আর এর সাম্প্রতিক সংস্করণগুলির জন্য অন্তর্নির্মিত ফাংশন, এটি হুডের নীচে একটি পিআরএল স্টাইলের রেজেক্স করে 'ঠিক' আমি এটি করতে কিছু দ্রুত কাস্টম সি কোড আশা করতে পারি। সম্ভবত trimwsরেজেক্স যথেষ্ট দ্রুত। stringr::str_trim(ভিত্তিক stringi) এটিতেও আকর্ষণীয় যে এটি সম্পূর্ণ স্বাধীন আন্তর্জাতিক স্ট্রিং লাইব্রেরি ব্যবহার করে। আপনি ভাববেন যে হোয়াইটস্পেস আন্তর্জাতিকীকরণের সমস্যা থেকে মুক্ত থাকবে তবে আমি অবাক হই wonder আমি কখনও নেটিভ বনাম stringr/ stringiবা কোনও মানদণ্ডের ফলাফলের তুলনা দেখিনি ।
জ্যাক ওয়াসে

কোনও কারণে আমি trimws()বুঝতে পারি না , আমার শীর্ষস্থানীয় সাদা স্থানগুলি সরাতে পারি নি, যখন ব্রায়ানের trim.strings()নীচে (কেবল 1 ভোট, আমার!) করেছে ...
প্যাট্রিক্ট

89

সাদা স্থানটি পরিচালনা করতে স্ট্রিংয়ের প্যাকেজে str_trim () ব্যবহার করুন। প্যাকেজটির ফেব্রুয়ারী 15,2013 তারিখের ম্যানুয়াল রয়েছে এবং এটি CRAN এ রয়েছে। ফাংশন স্ট্রিং ভেক্টরগুলিও পরিচালনা করতে পারে।

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

(ক্রেডিট মন্তব্যকারীকে যায়: আর। কটন)


2
এই সমাধানটি এমন কিছু মিউট্যান্ট হোয়াইটস্পেস trimws()সরিয়ে দিয়েছে যা অপসারণ করতে অক্ষম।
রিচার্ড টেলফোর্ড

1
@ রিচার্ডটেলফোর্ড আপনি একটি উদাহরণ প্রদান করতে পারেন? কারণ এটি ট্রিমগুলিতে একটি বাগ হিসাবে বিবেচিত হতে পারে।
wligtenberg

আইএমও এটিই সেরা সমাধান। কোড এবং
পিটার

প্রয়োজনীয় (স্ট্রিংগার) জন্য তাদের ডকুমেন্টেশন বা উদাহরণগুলির জন্য প্রয়োজনীয় কোডের এই লাইনটি নেই!
pgee70

23

শীর্ষস্থানীয় এবং অনুসরণযোগ্য শ্বেতস্পেস সরানোর জন্য একটি সাধারণ ফাংশন :

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

ব্যবহার:

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

11

বিজ্ঞাপন 1) সাদা স্থান দেখতে আপনি 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

হোয়াইটস্পেস এবং সাব থেকে এড়াতে পর্যবেক্ষণগুলি খুঁজে পেতে গ্রেপ বা গ্রেপল ব্যবহার করুন।

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
কেবল উল্লেখ করতে চেয়েছিলাম, হ্যাডলির রিজ এক্সপক্সের gsubপরিবর্তে এটি ব্যবহার করতে হবে sub। এর সাথে subকেবল অগ্রণী হোয়াইটস্পেস না থাকলে কেবল
পশ্চাদপসরণটি ছড়িয়ে দেওয়া

আপনি জানতেন না যে আপনি পার্ল = ফলস দিয়ে etc. গুলি ইত্যাদি ব্যবহার করতে পারেন। দস্তাবেজগুলি বলছে যে পসিক্স সিনট্যাক্স সে ক্ষেত্রে ব্যবহৃত হয়, তবে গৃহীত সিনট্যাক্সটি আসলে টিআরই রিজেক্স
জ্যোতির্ময় ভট্টাচার্য

5

আমি উত্তরটি ইউজার ৫6-তে মন্তব্য হিসাবে যুক্ত করতে পছন্দ করি তবে এখনও স্বতন্ত্র উত্তর হিসাবে লিখতে অক্ষম। নেতৃস্থানীয় এবং পিছনে ফাঁকা ফাঁকা অপসারণ gdata প্যাকেজ থেকে ট্রিম () ফাংশনের মাধ্যমেও অর্জন করা যেতে পারে:

require(gdata)
example(trim)

ব্যবহারের উদাহরণ:

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

5

যদি আপনার অভ্যন্তরীণ ইনপুটগুলির মধ্যে একাধিক স্পেস থাকে তবে অন্য সম্পর্কিত সমস্যা দেখা দেয়:

> 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 (ল্যাপলি (মাইডাটাফ্রেম, ট্রিমস), স্ট্রিংস এএফএফেক্টর = ফলস)


বা df[] <- lapply(df, trimws)আরও কমপ্যাক্ট হতে। তবে এটি উভয় ক্ষেত্রেই কলামকে চরিত্রের জন্য বাধ্য করবে। df[sapply(df,is.character)] <- lapply(df[sapply(df,is.character)], trimws)নিরাপদ হতে.
মুডি_ মুডস্কিপার

1

আমি ট্রিম চেষ্টা করেছি ()। সাদা স্পেসের পাশাপাশি '\ n' নিয়েও ভাল কাজ করে। x = 'n হার্ডডেন, জে। \ n'

ছাঁটা (x) এর


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

এর পরে, আপনাকে আরকে "অস্ট্রিয়া" স্তর হিসাবে স্বীকৃতি না দিতে জোর করতে হবে। আসুন আপনার কাছে "মার্কিন যুক্তরাষ্ট্র" এবং "স্পেন" স্তর হিসাবে ভান করুন:

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

সর্বাধিক ভোট দেওয়া প্রতিক্রিয়া থেকে কিছুটা কম ভয় দেখানো, তবে এটি এখনও কাজ করা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.