দুটি স্ট্রিং কীভাবে সংযুক্ত করা যায়?


375

আমি কীভাবে দুটি মানকে সংযুক্ত করতে পারি (মার্জ, সংযুক্ত) করব? উদাহরণস্বরূপ আমার আছে:

tmp = cbind("GAD", "AB")
tmp
#      [,1]  [,2]
# [1,] "GAD" "AB"

আমার লক্ষ্য হ'ল "tmp" এ দুটি মানকে একটি স্ট্রিংয়ে যুক্ত করা:

tmp_new = "GAD,AB"

কোন কাজটি আমার জন্য এটি করতে পারে?


@ রিচার্ডস্ক্রাইভানের উত্তর নোট হিসাবে স্ট্রিংগুলি যদি ভেক্টর হয় তবে এখানে বেশিরভাগ উত্তরগুলি ভেঙে যায়।
স্মি

@ এসএমসি আমি যে ছোট উত্তর পোস্ট করেছি তা সম্পর্কে কী? এটি উন্নত করার জন্য কোন পরামর্শ?
joel.wilson

উত্তর:


505
paste()

যাবার উপায় পূর্ববর্তী পোস্টারগুলিতে যেমন উল্লেখ করা হয়েছে, পেস্ট দুটি জিনিস করতে পারে:

একটিকে "স্ট্রিং" এর মধ্যে রূপান্তরিত মানগুলি উদাহরণস্বরূপ

> paste("Hello", "world", sep=" ")
[1] "Hello world"

যেখানে আর্গুমেন্টটি sepযুক্তিযুক্ত বা যুক্তিযুক্ত চরিত্রের ভেক্টরগুলিকে ভেঙে দেওয়ার জন্য ব্যবহার করতে অক্ষর (গুলি) নির্দিষ্ট করে

> x <- c("Hello", "World")
> x
[1] "Hello" "World"
> paste(x, collapse="--")
[1] "Hello--World"

যেখানে আর্গুমেন্টটি collapseভেদ করার জন্য ভেক্টরের উপাদানগুলির মধ্যে ব্যবহৃত অক্ষর (গুলি) নির্দিষ্ট করে।

আপনি উভয় একত্রিত করতে পারেন:

> paste(x, "and some more", sep="|-|", collapse="--")
[1] "Hello|-|and some more--World|-|and some more"

আশাকরি এটা সাহায্য করবে.


9
paste()আমার পছন্দ অনুসারে স্ট্রিং এবং ভেক্টর বা বিভিন্ন দৈর্ঘ্যের ভেক্টরগুলির মিশ্রণটি কিছুটা নমনীয় । উদাহরণস্বরূপ, paste(c('a','b'),'blah', c(1,2,3))ফলাফল "a blah 1" "b blah 2" "a blah 3"। মূলত, এটি স্ট্রিংগুলির একটি ভেক্টর তৈরি করে যেটি দীর্ঘতম ভেক্টরের পাশ দিয়ে গেছে এবং একই সাথে অন্যান্য ভেক্টর / স্ট্রিংগুলি একই দৈর্ঘ্যে লুপ করে। দুর্ঘটনাক্রমে আচরণের জন্য প্রচুর জায়গা।
nnot101

1
সত্য - তবে আপনি কি এমন বিকল্প পদ্ধতির সরবরাহ করতে পারেন যা প্রশ্নের সমাধান করে?
রেনার

1
না - আপনার উত্তরটি সঠিক (একইভাবে বলা অন্যান্য উত্তরগুলির মধ্যে বেশিরভাগই)। আমি কেবল লক্ষ করছিলাম যে পেস্টের আচরণটি তার নমনীয়তায় অস্বাভাবিক।
nnot101

2
@ naught101 আমি আর এর মান দ্বারা এটি অস্বাভাবিক বিবেচনা করব না। ভেক্টর পুনর্ব্যবহারযোগ্য ফাংশনগুলির একটি সাধারণ সম্পত্তি। মনে রাখবেন যে 'ব্লাহ' দৈর্ঘ্যের একটি ভেক্টর is. পুনর্ব্যবহারযোগ্য সম্পত্তি এটি paste0("blah", 1:3)পাওয়ার মতো কিছু করা সহজ করে তোলে "blah1" "blah2" "blah3"
Dason

5
হ্যাঁ, আমি আর সম্পর্কে অভিযোগ করা উচিত, কেবল পেস্ট করা নয়: পি। এটি আসলে আর জুড়েই অসঙ্গতিপূর্ণ - data.frame()যদি ভেক্টর একে অপরের একাধিক না হয় তবে আপনাকে এটি করতে দেয় না। matrix()সতর্কতা আউট থুতু, কিন্তু array()না। ধরণের বিরক্তিকর। সত্যিই, কিছু বিকল্প সেট না করা থাকলে তাদের সবার সতর্কতা ছুঁড়ে ফেলা উচিত ...
naught101

85

help.search() হ্যান্ডি ফাংশন, যেমন

> help.search("concatenate")

প্রদর্শন করব paste()


42

প্রথম paste()জবাব না দেওয়ার জন্য, আমরা নীচে stringr::str_c()(এবং তারপরে toString()) দেখতে পারি। এটি যতক্ষণ না এই প্রশ্নটি প্রায় দীর্ঘ হয়নি, তাই আমি মনে করি এটি বিদ্যমান বলে উল্লেখ করা দরকারী।

আপনি দেখতে পারেন হিসাবে ব্যবহার করার জন্য খুব সহজ।

tmp <- cbind("GAD", "AB")
library(stringr)
str_c(tmp, collapse = ",")
# [1] "GAD,AB"

এর ডকুমেন্টেশন ফাইলের বর্ণনা থেকে এটি এই সমস্যাটি দুর্দান্তভাবে ফিট করে।

Str_c কীভাবে কাজ করে তা বোঝার জন্য আপনাকে কল্পনা করতে হবে যে আপনি একটি ম্যাট্রিক্স স্ট্রিং তৈরি করছেন। প্রতিটি ইনপুট আর্গুমেন্ট একটি কলাম গঠন করে, এবং সাধারণ পুনর্ব্যবহারের নিয়মগুলি ব্যবহার করে দীর্ঘতম আর্গুমেন্টের দৈর্ঘ্যে প্রসারিত হয়। প্রতিটি কলামের মধ্যে সেপ স্ট্রিং isোকানো হয়। যদি ধস নুআল হয় তবে প্রতিটি সারি একটি একক স্ট্রিংয়ের মধ্যে পতিত হয়। যদি নন-নুল না হয় তবে স্ট্রিংটি প্রতিটি সারিটির শেষে isোকানো হয় এবং পুরো ম্যাট্রিক্স একটি স্ট্রিংয়ে পতিত হয়।

4/13/2016 যোগ করা হয়েছে : এটি আপনার পছন্দসই আউটপুট (অতিরিক্ত স্থান) এর মতো ঠিক নয় তবে এটির কথাও কেউ উল্লেখ করেনি। toString()মূলত হার্ড-কোডেড paste()সহ একটি সংস্করণ collapse = ", ", তাই আপনি এটি করতে পারেন

toString(tmp)
# [1] "GAD, AB"

3
হেই, এই একমাত্র উত্তর যা এই সত্যটিকে সম্বোধন করে যে tmp একটি ভেক্টর, এবং মানগুলির একগুচ্ছ pasteনয় - ভেক্টরগুলি করে না। অন্য বিকল্পটি হ'ল do.call(paste, as.list(tmp))
nnot101

35

অন্যরা paste()যেমন বলেছে, যাওয়ার উপায়। paste(str1, str2, str3, sep='')আপনি অ-ডিফল্ট বিভাজকটি চাইলে প্রতিবার টাইপ করতে পেরে বিরক্তিকর হতে পারে ।

আপনি খুব সহজেই মোড়ক ফাংশন তৈরি করতে পারেন যা জীবনকে আরও সহজ করে তোলে। উদাহরণস্বরূপ, যদি আপনি নিজেকে প্রায়শই কোনও বিভাজক না করে স্ট্র্যাটেটিং স্ট্রিংগুলি দেখতে পান তবে আপনি এটি করতে পারেন:

p <- function(..., sep='') {
    paste(..., sep=sep, collapse=sep)
}

বা যদি আপনি প্রায়শই কোনও ভেক্টরের স্ট্রিংগুলিতে যোগ দিতে চান (যেমন implode()পিএইচপি থেকে):

implode <- function(..., sep='') {
     paste(..., collapse=sep)
}

আপনাকে এটি করার অনুমতি দেয়:

p('a', 'b', 'c')
#[1] "abc"
vec <- c('a', 'b', 'c')
implode(vec)
#[1] "abc"
implode(vec, sep=', ')
#[1] "a, b, c"

এছাড়াও, সেখানে অন্তর্নির্মিত রয়েছে paste0, যা আমার মতো একই কাজ করে implodeতবে কাস্টম বিভাজককে অনুমতি না দিয়ে। এটা তোলে চেয়ে সামান্য বেশি কার্যকর paste()



28

বিকল্পভাবে, যদি আপনার উদ্দেশ্যটি সরাসরি কোনও ফাইল বা স্টডআউটে আউটপুট করা হয় তবে আপনি ব্যবহার করতে পারেন cat:

cat(s1, s2, sep=", ")

4
paste4 বছর পরে যখন pasteউত্তর ইতিমধ্যে কয়েক ডজন উত্তর আছে তখন একটি উত্তর পোস্ট করার বিষয়টি কী ?
ডেভিড আরেনবার্গ

4
আমি নিজের জন্য একাধিক উত্তর সংক্ষিপ্ত করতে সহায়ক বলে মনে করেছি। উদ্দেশ্যটি ছিল ভোট সংগ্রহ করা নয় বরং অনেকগুলি প্রস্তাবিত সমাধানের মাধ্যমে অন্যদের ফিল্টার করাতে সহায়তা করা। প্রায়শই আমি যা খুঁজছি
মেগাট্রন

22

অন্য উপায়:

sprintf("%s you can add other static strings here %s",string1,string2)

এটি কখনও কখনও paste()ফাংশন চেয়ে দরকারী । %sসাবজেক্টিভ স্ট্রিংগুলি অন্তর্ভুক্ত করা হবে যেখানে স্থান নির্দেশ করে।

মনে রাখবেন যে আপনি কোনও পথ তৈরির চেষ্টা করার সময় এটি কার্যকর হবে:

sprintf("/%s", paste("this", "is", "a", "path", sep="/"))

আউটপুট

/this/is/a/path

সি প্রোগ্রামারদের সাথে আর এর সাথে
লেনদেনকারীদের জন্য স্প্রিন্টফ

অনেক ভাল ইমো। pasteআপনি যদি স্ট্রিংয়ে কিছু যুক্ত করতে চান তবে এটি যথেষ্ট নমনীয় নয়।
displayname

20

আপনি নিজের অপারেটর তৈরি করতে পারেন:

'%&%' <- function(x, y)paste0(x,y)
"new" %&% "operator"
[1] newoperator`

আপনি 'এবং' ( &) অপারেটরের পুনরায় সংজ্ঞা দিতে পারেন :

'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"

বেসলাইন সিনট্যাক্সের সাথে জগাখিচুড়ি করা কুৎসিত, তবে তাই paste()/paste0()যদি আপনি কেবল নিজের কোড দিয়ে কাজ করেন তবে আপনি ব্যবহার করতে পারেন (প্রায় সর্বদা) লজিকাল & andঅপারেটরের সাথে *লজিকাল 'এবং &' ব্যবহারের পরিবর্তে লজিক্যাল মানগুলির গুণন করতে পারবেন


@ রিচার্ড স্ক্রিভেন মেযে আমি বুঝতে পারছি না, তবে এটি সোজা মনে হচ্ছে, তুলনা করুন: paste0(as.matrix(iris[1:4]) , as.matrix(iris[1:4]))এবংas.matrix(iris[1:4]) %&% as.matrix(iris[1:4])
কিউবিক

খুব খুব ভাল! এবং অনেক ভাষায় কনকেনটেশনের জন্য মানক, আমি আসলে মনে করি ডিফল্টরূপে এটি থাকা উচিত ছিল। এইভাবে
দৃ

14

আপনি তৈরি করেছেন ম্যাট্রিক্স, টিএমপি,

paste(tmp[1,], collapse = ",")

আমি ধরে নিয়েছি যে আপনি সিবাইন্ড ব্যবহার করে ম্যাট্রিক্স তৈরি করার কিছু কারণ রয়েছে, কেবল তার বিপরীতে:

tmp <- "GAD,AB"

3

স্ট্রিংগুলি কলামগুলি রয়েছে সে ক্ষেত্রে বিবেচনা করুন এবং ফলাফলটি একটি নতুন কলাম হওয়া উচিত:

df <- data.frame(a = letters[1:5], b = LETTERS[1:5], c = 1:5)

df$new_col <- do.call(paste, c(df[c("a", "b")], sep = ", ")) 
df
#  a b c new_col
#1 a A 1    a, A
#2 b B 2    b, B
#3 c C 3    c, C
#4 d D 4    d, D
#5 e E 5    e, E

[c("a", "b")]Allচ্ছিকভাবে, সমস্ত কলামগুলি আটকানো দরকার হলে সাবসেটিংটি এড়িয়ে যান।

# you can also try str_c from stringr package as mentioned by other users too!
do.call(str_c, c(df[c("a", "b")], sep = ", ")) 

ঠিক আছে তবে stringi, stringrগ্রন্থাগারগুলি দ্রুততর।
smci

2

আর একটি নন-পেস্ট উত্তর:

x <- capture.output(cat(data, sep = ","))
x
[1] "GAD,AB"

কোথায়

 data <- c("GAD", "AB")

2

glueএকটি নতুন ফাংশন, ডেটা ক্লাস এবং প্যাকেজ যা এর অংশ হিসাবে বিকাশিত হয়েছে যার tidyverseপ্রচুর বর্ধিত কার্যকারিতা রয়েছে। এটি পেস্ট, স্প্রিন্টফ এবং পূর্ববর্তী অন্যান্য উত্তরগুলির বৈশিষ্ট্যগুলি একত্রিত করে।

tmp <- tibble::tibble(firststring = "GAD", secondstring = "AB")
(tmp_new <- glue::glue_data(tmp, "{firststring},{secondstring}"))
#> GAD,AB

2019-03-06 এ ডিপেক্স প্যাকেজ (v0.2.1) দ্বারা তৈরি

হ্যাঁ, এই প্রশ্নের সাধারণ উদাহরণের জন্য এটি অত্যধিক দক্ষ, তবে অনেক পরিস্থিতিতে শক্তিশালী। ( https://glue.tidyvers.org/ দেখুন )

নীচের pasteসাথে তুলনায় দ্রুত উদাহরণ withglueকোড টাইপ করতে একটু সহজ ছিল এবং অল্প সহজ পড়া বলে মনে হচ্ছে।

tmp <- tibble::tibble(firststring = c("GAD", "GAD2", "GAD3"), secondstring = c("AB1", "AB2", "AB3"))
(tmp_new <- glue::glue_data(tmp, "{firststring} and {secondstring} went to the park for a walk. {firststring} forgot his keys."))
#> GAD and AB1 went to the park for a walk. GAD forgot his keys.
#> GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys.
#> GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys.
(with(tmp, paste(firststring, "and", secondstring, "went to the park for a walk.", firststring, "forgot his keys.")))
#> [1] "GAD and AB1 went to the park for a walk. GAD forgot his keys."  
#> [2] "GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys."
#> [3] "GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys."

2019-03-06 এ ডিপেক্স প্যাকেজ (v0.2.1) দ্বারা তৈরি

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