2013-06-17 24 views
5

tôi cần phải dán chuỗi "mỗi" thành "mỗi": thay vìLàm thế nào để cross-dán chuỗi (mỗi-mỗi-mỗi)?

> paste0(c("a", "b"), c("c", "d")) 
[1] "ac" "bd" 

Tôi muốn nhận

[1] "ac" "ad" "bc" "bd" 

Làm thế nào để làm điều đó?

Cảm ơn.

+0

Điều này có thể không đáng kể, nhưng tôi không thể tìm thấy chức năng 'paste0'. Tôi đoán 'paste0 <- function (...) {paste (..., sep =" ")}', đúng không? – rbatt

+2

'paste0' được thêm vào trong R 2.15.0 và nó là phiên bản dán nhanh hơn (hơi) với dấu phân cách mặc định làm chuỗi rỗng. –

+0

@AdamHyland O wow, tôi hoàn toàn bỏ lỡ điều đó, cảm ơn! – rbatt

Trả lời

8

Bạn cũng có thể làm:

outer(c("a", "b"), c("c", "d"), FUN = "paste0")[1:4] 
[1] "ac" "bc" "ad" "bd" 

Cả hai do.callouter là các chức năng có giá trị để chơi cùng. :)

Tiếp theo, tôi có thể gán

x <- outer(c("a", "b"), c("c", "d"), FUN = "paste0") 
dim(x) <- NULL 
x 
[1] "ac" "bc" "ad" "bd" 

Mà không biết chiều dài.

Chỉnh sửa khác!

x <- outer(c("a", "b"), c("c", "d"), FUN = "paste0") 
y <- t(x) 
dim(y) <- NULL 
y 
[1] "ac" "ad" "bc" "bd" 

Cũng sẽ nhận được đơn đặt hàng bạn muốn.

+0

Có cách nào để dán nhiều hơn hai chuỗi không? –

9

Hãy thử điều này:

x <- c("a", "b") 
y <- c("c", "d") 

do.call(paste0, expand.grid(x, y)) 
# [1] "ac" "bc" "ad" "bd" 

Nó có khả năng là chậm hơn so với outer khi xy là dài, nhưng mặt khác nó cho phép tổng quát sau:

z <- c("e", "f") 

do.call(paste0, expand.grid(x, y, z)) 
# [1] "ace" "bce" "ade" "bde" "acf" "bcf" "adf" "bdf" 
+1

Bạn có thể viết một wrapper đệ quy để 'bên ngoài' mà sẽ làm điều đó cho một tùy ý số lượng đầu vào. It's WAAAY uglier hơn 'expand.grid' (xem [ở đây] (https://gist.github.com/Protonk/5799974) cho lần cắt đầu tiên) nhưng nó nhanh hơn. Tuy nhiên, như tôi lưu ý, bạn có thể chạy đoạn mã 200.000 lần trong ~ 1/20 giây, vì vậy có thể là ok. :) –

+0

@Julius, câu trả lời của bạn rất tiện dụng (+1). Tuy nhiên, có cách nào để bảo toàn trật tự - giả sử khi đặt tên cột, v.v ...? Ví dụ: ở trên, nếu thứ tự bắt buộc là "" ac "" ad "" bc "" bd "'? Trong trường hợp của tôi, tôi có những từ cần được dán lại với nhau theo một thứ tự cụ thể (để giữ lại ý nghĩa). Cảm ơn! – harkmug

+2

@rmk, một cách tối ưu để làm điều đó là chú ý rằng 'expand.grid' sử dụng thứ tự đảo ngược theo nghĩa so với những gì bạn cần, do đó' do.call (paste0, expand.grid (y, x) [ 2: 1]) 'nên hoạt động. Tương tự, ví dụ: 'expand.grid (z, y, x) [3: 1]'. – Julius

7

khác (ít thường hữu ích) bùa:

levels(interaction(x,y,sep="")) 
# [1] "ac" "bc" "ad" "bd" 
Các vấn đề liên quan