2011-08-26 37 views
277

Làm cách nào để hợp nhất/kết hợp hai giá trị trong R? Ví dụ tôi có:Làm cách nào để có thể ghép nối 2 chuỗi?

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

Mục tiêu của tôi là để có được tmp là một chuỗi

tmp_new = "GAD,AB" 

Những chức năng có thể làm điều này cho tôi?

+0

Hầu hết các câu trả lời ở đây đều bị hỏng nếu chuỗi là vectơ, như ghi chú câu trả lời của @ RichardScriven. – smci

+0

@smci những gì về câu trả lời nhỏ tôi đã đăng? bất kỳ đề xuất để cải thiện nó? –

Trả lời

13

Với ma trận, tmp, mà bạn đã tạo:

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

tôi giả sử có một số lý do tại sao bạn đang tạo ma trận bằng cách sử dụng cbind, chứ không phải chỉ đơn giản là:

tmp <- "GAD,AB" 
357
paste() 

là cách để thực hiện. Như các áp phích trước đã chỉ ra, dán có thể làm hai việc:

ghép các giá trị thành một "chuỗi", ví dụ:

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

nơi tranh luận sep quy định các ký tự (s) sẽ được sử dụng giữa các đối số để ghép, hoặc thu gọn vectơ nhân vật

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

nơi tranh luận collapse quy định các ký tự (s) là được sử dụng giữa các phần tử của vectơ bị thu gọn.

Bạn thậm chí có thể kết hợp cả hai:

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

Hope this helps.

+6

Việc trộn các chuỗi và vec-tơ hoặc vectơ có độ dài khác nhau là một chút quá linh hoạt trong 'dán()' theo ý thích của tôi. Ví dụ, 'dán (c ('a', 'b'), 'blah', c (1,2,3))' kết quả trong '" a blah 1 "" b blah 2 "" a blah 3 "' . Về cơ bản, nó tạo ra một vectơ các chuỗi có cùng độ dài với vectơ dài nhất được truyền vào, và lặp lại các vectơ/chuỗi khác với cùng độ dài. Rất nhiều phòng cho hành vi ngẫu nhiên ở đó. – naught101

+1

Đúng - nhưng bạn có thể cung cấp một phương pháp thay thế để giải quyết câu hỏi? – Rainer

+1

không - câu trả lời của bạn là chính xác (như hầu hết các câu trả lời khác nói cùng một điều). Tôi chỉ chú ý rằng hành vi của dán là bất thường trong sự linh hoạt của nó. – naught101

70

help.search() là một chức năng hữu ích, ví dụ:

> help.search("concatenate") 

sẽ dẫn bạn đến paste().

20

Như những người khác đã chỉ ra, paste() là cách để thực hiện. Nhưng nó có thể gây phiền nhiễu khi phải gõ paste(str1, str2, str3, sep='') mỗi khi bạn muốn dấu phân cách không mặc định.

Bạn có thể dễ dàng tạo các hàm bao bọc làm cho đơn giản hơn nhiều.Ví dụ, nếu bạn thấy mình concatenating chuỗi không có dấu phân cách thực sự thường xuyên, bạn có thể làm:

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

hoặc nếu bạn thường hay muốn tham gia chuỗi từ một vector (như implode() từ php):

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

Cho phép bạn làm điều này:

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

Ngoài ra, có việc xây dựng trong paste0, mà làm điều tương tự như implode của tôi, nhưng mà không allo cánh tách tùy chỉnh. Nó hiệu quả hơn một chút so với paste().

32

Đối với câu trả lời đầu tiên không phải là paste(), chúng tôi có thể xem stringr::str_c() (và sau đó toString() bên dưới). Nó đã không được xung quanh miễn là câu hỏi này, vì vậy tôi nghĩ rằng nó hữu ích để đề cập đến nó cũng tồn tại.

Rất đơn giản để sử dụng, như bạn có thể thấy.

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

Từ mô tả tệp tài liệu, nó phù hợp với vấn đề này một cách độc đáo.

Để hiểu cách str_c hoạt động, bạn cần phải hình dung rằng bạn đang xây dựng một ma trận chuỗi. Mỗi đối số đầu vào tạo thành một cột và được mở rộng đến độ dài của đối số dài nhất, sử dụng các quy tắc tái tạo thông thường. Chuỗi sep được chèn vào giữa mỗi cột. Nếu thu gọn là NULL, mỗi hàng được thu gọn thành một chuỗi. Nếu không NULL chuỗi đó được chèn vào cuối mỗi hàng, và toàn bộ ma trận được thu gọn thành một chuỗi.

Added 2016/04/13: Nó không hoàn toàn giống như đầu ra mong muốn của bạn (thêm không gian), nhưng không có ai có đề cập nó một trong hai. toString() về cơ bản là một phiên bản của paste() với collapse = ", " mã hóa cứng, vì vậy bạn có thể làm

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

Heh, đây là câu trả lời duy nhất giải quyết thực tế rằng tmp là một véc tơ, và không chỉ là một loạt các giá trị - 'dán' không làm vectơ . Tùy chọn khác là 'do.call (dán, as.list (tmp))'. – naught101

22

Ngoài ra, nếu mục tiêu của bạn là để đầu ra trực tiếp vào một tập tin hoặc stdout, bạn có thể sử dụng cat:

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

Vì vậy, những gì các điểm gửi một câu trả lời 'dán' 4 năm sau đó khi có khoảng một chục câu trả lời' dán' đã? –

+3

Vào thời điểm đó, tôi thấy hữu ích khi tóm tắt nhiều câu trả lời cho chính tôi. Mục tiêu không phải là thu thập phiếu bầu mà còn giúp người khác lọc qua nhiều giải pháp được cung cấp. Thường đó là những gì tôi đang tìm kiếm. – Megatron

16

bạn có thể tạo bạn hành riêng:

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

bạn cũng có thể định nghĩa lại 'và' (&) op erator:

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

rối tung với cú pháp cơ bản là xấu xí, nhưng như vậy là sử dụng paste()/paste0() nếu bạn chỉ làm việc với mã riêng của bạn, bạn có thể (hầu như luôn luôn) thay thế logic & and điều hành với * và làm phép nhân các giá trị logic thay vì sử dụng logic và & '

+0

@Richard Scriven mayby ​​Tôi không hiểu, nhưng nó có vẻ đơn giản, so sánh: 'paste0 (as.matrix (iris [1: 4]), as.matrix (iris [1: 4]))' và 'as. ma trận (iris [1: 4])% &% as.matrix (iris [1: 4]) ' – Qbik

11

Một cách khác:

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

Nó đôi khi hữu ích hơn paste() chức năng. %s biểu thị vị trí mà các chuỗi chủ quan sẽ được bao gồm.

Lưu ý rằng điều này sẽ có ích khi bạn cố gắng xây dựng một con đường:

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

đầu ra

/this/is/a/path 
+0

cho lập trình viên C đối phó với R, sprintf là quen thuộc và hữu ích cho" nối hai chuỗi " – subsci

+0

Imho tốt hơn nhiều. 'dán' không đủ linh hoạt nếu bạn muốn nối thêm gì đó vào một chuỗi. – displayname

1

Hãy xem xét trường hợp dây là cột và kết quả nên cột mới :

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 

Tùy chọn, bỏ qua [c("a", "b")] nếu tất cả các cột mốc ns cần được dán.

# 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

Ok nhưng thư viện 'stringi, stringr' nhanh hơn. – smci

Các vấn đề liên quan