Как объединить две строки? - PullRequest
       12

Как объединить две строки?

344 голосов
/ 26 августа 2011

Как я могу объединить (объединить, объединить) два значения? Например, у меня есть:

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

Моя цель - объединить два значения в «tmp» в одну строку:

tmp_new = "GAD,AB"

Какая функция может сделать это для меня?

Ответы [ 12 ]

459 голосов
/ 26 августа 2011
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"

Надеюсь, это поможет.

80 голосов
/ 29 сентября 2011

help.search() - удобная функция, например,

> help.search("concatenate")

приведет вас к paste().

40 голосов
/ 08 июля 2014

Для первого не paste() ответа мы можем посмотреть stringr::str_c() (а затем toString() ниже). Этот вопрос уже давно не существует, поэтому я считаю полезным упомянуть, что он также существует.

Очень прост в использовании, как видите.

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

Из описания файла документации он прекрасно подходит для этой проблемы.

Чтобы понять, как работает str_c, вам нужно представить, что вы строите матрицу строк. Каждый входной аргумент формирует столбец и расширяется до длины самого длинного аргумента, используя обычные правила повторного использования. Строка sep вставляется между каждым столбцом. Если свернуть NULL, каждая строка свернута в одну строку. Если не NULL, эта строка вставляется в конец каждой строки, и вся матрица сворачивается в одну строку.

Добавлено 13.04.2016 : Оно не совсем совпадает с вашим желаемым выводом (дополнительное пространство), но никто также не упомянул его. toString() в основном версия paste() с collapse = ", " жестко запрограммированным, так что вы можете сделать

toString(tmp)
# [1] "GAD, AB"
32 голосов
/ 08 июля 2014

Как уже отмечали другие, 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().

30 голосов
/ 26 августа 2011
> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"

Я нашел это в Google, выполнив поиск R сцепленных строк : http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html

28 голосов
/ 12 июня 2015

В качестве альтернативы, если вашей целью является вывод непосредственно в файл или стандартный вывод, вы можете использовать cat:

cat(s1, s2, sep=", ")
17 голосов
/ 30 сентября 2016

Другой способ:

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
17 голосов
/ 23 апреля 2016

Вы можете создать свой собственный оператор:

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

Вы также можете переопределить операторы 'и' (&):

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

Работа с базовым синтаксисом уродлива, ноТо же самое можно сказать, используя paste()/paste0(), если вы работаете только со своим собственным кодом, вы можете (почти всегда) заменить логический оператор & and на * и выполнять умножение логических значений вместо использования логических 'и &'

14 голосов
/ 26 августа 2011

Учитывая матрицу, tmp, которую вы создали:

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

Я предполагаю, что есть причина, по которой вы создаете матрицу с использованием cbind, а не просто:

tmp <- "GAD,AB"
2 голосов
/ 23 января 2017

Рассмотрим случай, когда строки представляют собой столбцы, а результатом должен быть новый столбец:

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")], если необходимо вставить все столбцы.

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