如何合併/合併R中的兩個值? 比如我有:2個字符串如何連接?
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
我的目標是讓TMP作爲一個字符串
tmp_new = "GAD,AB"
哪個函數能爲我做到這一點?
如何合併/合併R中的兩個值? 比如我有:2個字符串如何連接?
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
我的目標是讓TMP作爲一個字符串
tmp_new = "GAD,AB"
哪個函數能爲我做到這一點?
> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"
我發現這個由谷歌通過搜索[R連接字符串:給定矩陣,TMP http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html
,您創建:
paste(tmp[1,], collapse = ",")
我認爲有一些原因你正在用cbind創建一個矩陣,而不是簡單的:
tmp <- "GAD,AB"
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"
希望這有助於。
help.search()
是一個方便的功能,例如,
> help.search("concatenate")
會引導您到paste()
。
正如其他人指出的,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()
略高效。
對於第一個非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"
嘿,這是解決tmp是一個向量的唯一答案,而不僅僅是一堆值 - '粘貼'不做矢量。另一個選項是'do.call(paste,as.list(tmp))'。 – naught101
另外,如果你的目標是直接輸出到一個文件或標準輸出,你可以使用cat
:
cat(s1, s2, sep=", ")
那麼在4年後,當有大約十幾個'paste'回答時,發佈'paste'回答的是什麼? –
當時我發現有助於爲自己總結多個答案。目標不是收集選票,而是幫助其他人過濾衆多提供的解決方案。通常這就是我要找的。 – Megatron
你可以創建你自己的操作:
'%&%' <- function(x, y)paste0(x,y)
"new" %&% "operator"
[1] newoperator`
您也可以重新定義「和」(&
)運愛適易:
'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"
與基礎語法搞亂是醜陋的,但如果你用自己的代碼只是工作,你可以(幾乎總是)與*
代替邏輯& and
運營商,做邏輯值的乘法,而不是使用所以使用paste()/paste0()
邏輯 '與&'
@Richard Scriven mayby我不明白,但看起來很直接,比較:'paste0(as.matrix(iris [1:4]),as.matrix(iris [1:4]))'和'as。矩陣(虹膜[1:4])%&%as.matrix(虹膜[1:4])' – Qbik
的另一種方法:
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
針對處理R的C程序員,sprintf對於「連接兩個字符串」是熟悉的和有用的 – subsci
非常好。如果你想把某些東西附加到一個字符串上,'paste'不夠靈活。 – displayname
考慮這樣的字符串列,結果應該是一個新列的情況下:
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 = ", "))
好吧,但'stringi,stringr'庫更快。 – smci
如果字符串是向量,這裏的大多數答案都會打斷,就像@ RichardScriven的答案筆記一樣。 – smci
@smci那我發佈的小答案呢?任何改善它的建議? –