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

275

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

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

Моя цель - получить tmp как одну строку

tmp_new="GAD,AB"

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

  • 0
    Большинство ответов здесь ломаются, если строки являются векторами, как отмечает ответ @ RichardScriven.
  • 0
    @smci как насчет небольшого ответа, который я отправил? какие-либо предложения, чтобы улучшить это?
Теги:
string
merge
concatenation
string-concatenation

12 ответов

352
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"

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

  • 8
    Смешивание строк и векторов или векторов разной длины слишком гибко в paste() на мой взгляд. Например, paste(c('a','b'),'blah', c(1,2,3)) приводит к "a blah 1" "b blah 2" "a blah 3" . По сути, он создает вектор строк той же длины, что и самый длинный вектор, который был передан, и зацикливает другие векторы / строки на ту же длину. Там много места для случайного поведения.
  • 1
    Верно - но можете ли вы предоставить альтернативный подход, который решает вопрос?
Показать ещё 3 комментария
66

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

> help.search("concatenate")

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

30

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

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

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

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

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

Добавлено 4/13/2016. Это не то же самое, что и ваш желаемый результат (дополнительное пространство), но никто и не упомянул об этом. toString() - это в основном версия paste() с collapse = ", " жестко закодированная, поэтому вы можете сделать

toString(tmp)
# [1] "GAD, AB"
  • 3
    Хех, это единственный ответ, который касается того факта, что tmp является вектором, а не просто набором значений - paste не делает векторов. Другой вариант - do.call(paste, as.list(tmp)) .
21

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

cat(s1, s2, sep=", ")
  • 4
    Так какой смысл публиковать ответ paste 4 года, когда уже есть около десятка ответов paste ?
  • 3
    В то время я нашел полезным обобщить несколько ответов для себя. Цель состояла не в том, чтобы собрать голоса, а в том, чтобы помочь другим отфильтровать множество предлагаемых решений. Часто это то, что я ищу.
21
> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"

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

18

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

15

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

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

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

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

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

  • 0
    @Richard Scriven, может, я не понимаю, но это кажется простым, сравните: paste0(as.matrix(iris[1:4]) , as.matrix(iris[1:4])) и as.matrix(iris[1:4]) %&% as.matrix(iris[1:4])
13

С учетом созданной вами матрицы tmp:

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

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

tmp <- "GAD,AB"
10

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

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
  • 0
    для программистов на C, работающих с R, sprintf знаком и полезен для "объединения двух строк"
  • 0
    Гораздо лучше, имхо. paste недостаточно гибкая, если вы хотите добавить что-то в строку.
2

Самый простой способ для новичков конкатенировать строку - это использовать str_c.

library(stringr)
str_c("May", "The", "Force", "Be", "With", "You")
## [1] "MayTheForceBeWithYou"

Пожалуйста, установите stringr в пакет: install.packages("stringr")

1

Используйте команду Вставить "для конкатенации.

new_function <- function(conditionValue){
  returnValue <- ""
  if(conditionValue == 1)
    returnValue <- "Passed value is 1"
  else if(conditionValue == 2)
    returnValue <- "Passed values is 2"
  else
    returnValue <- paste("Passed value is " , conditionValue)
}
print(new_function(1))
    [1] "Passed value is 1"
print(new_function(2))
    [1] "Passed values is 2"
print(new_function(3))
   [1] "Passed value is  3"

Подробнее: https://www.r-bloggers.com/string-concatenation-in-r/

0

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

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 = ", ")) 
  • 0
    Хорошо, но stringi, stringr библиотеки stringi, stringr работают быстрее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню