2011-08-26 140 views
277

如何合併/合併R中的兩個值? 比如我有:2個字符串如何連接?

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

我的目標是讓TMP作爲一個字符串

tmp_new = "GAD,AB" 

哪個函數能爲我做到這一點?

+0

如果字符串是向量,這裏的大多數答案都會打斷,就像@ RichardScriven的答案筆記一樣。 – smci

+0

@smci那我發佈的小答案呢?任何改善它的建議? –

回答

13

,您創建:

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

我認爲有一些原因你正在用cbind創建一個矩陣,而不是簡單的:

tmp <- "GAD,AB" 
357
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" 

希望這有助於。

+6

混合字符串和向量或不同長度的向量在'paste()'中有點太靈活了,以滿足我的喜好。例如,'paste(c('a','b'),'blah',c(1,2,3))'會導致一個錯誤1「」b blah 2「」一個錯誤3「 。基本上,它會創建一個與傳入的最長向量長度相同的字符串向量,並將其他向量/字符串循環到相同的長度。那裏有足夠的意外行爲空間。 – naught101

+1

正確 - 但您能否提供解決問題的替代方法? – Rainer

+1

否 - 你的回答是正確的(正如大多數其他答案一樣)。我只是注意到,粘貼的行爲在其靈活性上是不尋常的。 – naught101

70

help.search()是一個方便的功能,例如,

> help.search("concatenate") 

會引導您到paste()

20

正如其他人指出的,paste()是要走的路。但是,如果每次需要非默認分隔符,都必須輸入paste(str1, str2, str3, sep=''),否則會很煩人。

您可以非常容易地創建使得更簡單的包裝函數。舉例來說,如果你發現自己連接字符串,沒有分隔真的時候,你可以這樣做:

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

,或者如果你經常想從一個向量(如implode()從PHP)加入字符串:

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()略高效。

32

對於第一個非paste()的答案,我們可以看看stringr::str_c()(然後下面的toString())。它一直沒有出現過這個問題,所以我認爲提及它也存在很有用。如你所見,使用非常簡單。

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

從它的文檔文件描述中可以很好地解決這個問題。

要理解str_c是如何工作的,你需要想象你正在建立一個字符串矩陣。每個輸入參數形成一個列,並使用通常的回收規則擴展爲最長參數的長度。 sep字符串插入每列之間。如果collapse爲NULL,則每行都摺疊爲一個字符串。如果在每行的末尾插入非空字符串,並且整個矩陣摺疊爲單個字符串。

新增2016年4月13日:這不完全一樣,你需要的輸出(額外的空間),但沒有人要麼提到。 toString()基本上是一個版本的paste()collapse = ", "硬編碼的,所以你可以做

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

嘿,這是解決tmp是一個向量的唯一答案,而不僅僅是一堆值 - '粘貼'不做矢量。另一個選項是'do.call(paste,as.list(tmp))'。 – naught101

22

另外,如果你的目標是直接輸出到一個文件或標準輸出,你可以使用cat

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

那麼在4年後,當有大約十幾個'paste'回答時,發佈'paste'回答的是什麼? –

+3

當時我發現有助於爲自己總結多個答案。目標不是收集選票,而是幫助其他人過濾衆多提供的解決方案。通常這就是我要找的。 – Megatron

16

你可以創建你自己的操作:

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

您也可以重新定義「和」(&)運愛適易:

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

與基礎語法搞亂是醜陋的,但如果你用自己的代碼只是工作,你可以(幾乎總是)與*代替邏輯& and運營商,做邏輯值的乘法,而不是使用所以使用paste()/paste0()邏輯 '與&'

+0

@Richard Scriven mayby我不明白,但看起來很直接,比較:'paste0(as.matrix(iris [1:4]),as.matrix(iris [1:4]))'和'as。矩陣(虹膜[1:4])%&%as.matrix(虹膜[1:4])' – Qbik

11

的另一種方法:

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 
+0

針對處理R的C程序員,sprintf對於「連接兩個字符串」是熟悉的和有用的 – subsci

+0

非常好。如果你想把某些東西附加到一個字符串上,'paste'不夠靈活。 – displayname

1

考慮這樣的字符串列,結果應該是一個新列的情況下:

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")]子集,如果所有列ns需要粘貼。

# 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 = ", ")) 
+0

好吧,但'stringi,stringr'庫更快。 – smci