Nối một vectơ của chuỗi / ký tự


273

Nếu tôi có một vectơ loại ký tự, làm thế nào tôi có thể nối các giá trị thành chuỗi? Đây là cách tôi sẽ làm điều đó với paste () :

sdata = c('a', 'b', 'c')
paste(sdata[1], sdata[2], sdata[3], sep ='')

năng suất "abc".

Nhưng tất nhiên, điều đó chỉ hoạt động nếu tôi biết độ dài của sdata trước thời hạn.

Câu trả lời:


480

Hãy thử sử dụng một đối số thu gọn trống trong hàm dán:

paste(sdata, collapse = '')

Nhờ vào http://twitter.com/onelinetips/status/7491806343


7
Chỉ cần lưu ý rằng nếu sdatacó thể chứa một trong hai chuỗi có cùng độ dài hoặc độ dài thay đổi thì paste(sdata, sep = '', collapse = '')nên sử dụng để tránh kết quả không mong muốn.
zelanix

42

Câu trả lời của Matt chắc chắn là câu trả lời đúng. Tuy nhiên, đây là một giải pháp thay thế cho mục đích cứu trợ truyện tranh:

do.call(paste, c(as.list(sdata), sep = ""))

6
bạn thực sự có thể đã làm việc một câu lệnh áp dụng () trong đó. Nếu bạn làm tôi sẽ bỏ phiếu cho bạn;)
JD Long

đây thực sự sẽ là giải pháp tao nhã nhất nếu collapsetham số không tồn tại. vì vậy không có nhiều sự hài hước nếu gần đây bạn thực sự phải làm một cái gì đó rất giống nhau :)
cừu bay

9

Bạn có thể sử dụng stri_pastehàm với collapsetham số từ stringigói như thế này:

stri_paste(letters, collapse='')
## [1] "abcdefghijklmnopqrstuvwxyz" 

Và một số điểm chuẩn:

require(microbenchmark)
test <- stri_rand_lipsum(100)
microbenchmark(stri_paste(test, collapse=''), paste(test,collapse=''), do.call(paste, c(as.list(test), sep="")))
Unit: microseconds
                                      expr     min       lq     mean   median       uq     max neval
           stri_paste(test, collapse = "") 137.477 139.6040 155.8157 148.5810 163.5375 226.171   100
                paste(test, collapse = "") 404.139 406.4100 446.0270 432.3250 442.9825 723.793   100
do.call(paste, c(as.list(test), sep = "")) 216.937 226.0265 251.6779 237.3945 264.8935 405.989   100

2
Tôi chưa bao giờ thực hiện điểm chuẩn trên R. Rất vui được học điều gì đó mới.
Torrien

6

Dành cho sdata:

gsub(", ","",toString(sdata))

Đối với một vectơ số nguyên:

gsub(", ","",toString(c(1:10)))

6
Đây là một câu trả lời nguy hiểm - nếu có các chuỗi dấu phẩy trong các phần tử của vectơ, câu trả lời này sẽ loại bỏ chúng.
C8H10N4O2 18/03/2016

5

Câu trả lời của Matt Turner chắc chắn là câu trả lời đúng. Tuy nhiên, theo tinh thần câu trả lời của Ken Williams, bạn cũng có thể làm:

capture.output(cat(sdata, sep="")) 

1

Dưới đây là một hàm tiện ích nhỏ thu gọn danh sách các giá trị được đặt tên hoặc chưa đặt tên thành một chuỗi để in dễ dàng hơn. Nó cũng sẽ tự in dòng mã. Đó là từ ví dụ danh sách của tôi trong R trang

Tạo một số danh sách có tên hoặc không tên:

# Define Lists
ls_num <- list(1,2,3)
ls_str <- list('1','2','3')
ls_num_str <- list(1,2,'3')

# Named Lists
ar_st_names <- c('e1','e2','e3')
ls_num_str_named <- ls_num_str
names(ls_num_str_named) <- ar_st_names

# Add Element to Named List
ls_num_str_named$e4 <- 'this is added'

Đây là một hàm sẽ chuyển đổi danh sách có tên hoặc không tên thành chuỗi:

ffi_lst2str <- function(ls_list, st_desc, bl_print=TRUE) {

  # string desc
  if(missing(st_desc)){
    st_desc <- deparse(substitute(ls_list))
  }

  # create string
  st_string_from_list = paste0(paste0(st_desc, ':'), 
                               paste(names(ls_list), ls_list, sep="=", collapse=";" ))

  if (bl_print){
    print(st_string_from_list)
  }
}

Kiểm tra chức năng với các danh sách được tạo trước:

> ffi_lst2str(ls_num)
[1] "ls_num:=1;=2;=3"
> ffi_lst2str(ls_str)
[1] "ls_str:=1;=2;=3"
> ffi_lst2str(ls_num_str)
[1] "ls_num_str:=1;=2;=3"
> ffi_lst2str(ls_num_str_named)
[1] "ls_num_str_named:e1=1;e2=2;e3=3;e4=this is added"

Kiểm tra hàm với tập hợp các phần tử danh sách:

> ffi_lst2str(ls_num_str_named[c('e2','e3','e4')])
[1] "ls_num_str_named[c(\"e2\", \"e3\", \"e4\")]:e2=2;e3=3;e4=this is added"
> ffi_lst2str(ls_num[2:3])
[1] "ls_num[2:3]:=2;=3"
> ffi_lst2str(ls_str[2:3])
[1] "ls_str[2:3]:=2;=3"
> ffi_lst2str(ls_num_str[2:4])
[1] "ls_num_str[2:4]:=2;=3;=NULL"
> ffi_lst2str(ls_num_str_named[c('e2','e3','e4')])
[1] "ls_num_str_named[c(\"e2\", \"e3\", \"e4\")]:e2=2;e3=3;e4=this is added"
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.