Как объединить две строки?
Как я могу объединить (объединить, объединить) два значения? Например у меня есть:
tmp = cbind("GAD", "AB")
tmp
# [,1] [,2]
# [1,] "GAD" "AB"
Моя цель - объединить два значения в "tmp" в одну строку:
tmp_new = "GAD,AB"
Какая функция может сделать это для меня?
11 ответов
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"
Надеюсь это поможет.
help.search()
это удобная функция, например,
> help.search("concatenate")
приведет вас к paste()
,
Для первого не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"
Как уже отмечали другие, 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()
,
> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"
Я нашел это в Google, выполнив поиск строк R: http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html
В качестве альтернативы, если вашей целью является вывод непосредственно в файл или стандартный вывод, вы можете использовать cat
:
cat(s1, s2, sep=", ")
По-другому:
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
Вы можете создать свой собственный оператор:
'%&%' <- function(x, y)paste0(x,y)
"new" %&% "operator"
[1] newoperator`
Вы также можете переопределить 'и' (&
) оператор:
'&' <- function(x, y)paste0(x,y)
"dirty" & "trick"
"dirtytrick"
возиться с базовым синтаксисом некрасиво, но использует paste()/paste0()
если вы работаете только со своим собственным кодом, вы можете (почти всегда) заменить логический & and
оператор с *
и делать умножение логических значений вместо использования логических 'и &'
Учитывая матрицу tmp, которую вы создали:
paste(tmp[1,], collapse = ",")
Я предполагаю, что есть некоторая причина, почему вы создаете матрицу с использованием cbind, а не просто:
tmp <- "GAD,AB"
Рассмотрим случай, когда строки являются столбцами, а результатом должен быть новый столбец:
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 = ", "))
glue
это новая функция, класс данных и пакет, который был разработан как часть tidyverse
, с большим количеством расширенной функциональности. Он сочетает в себе функции из paste, sprintf и других предыдущих ответов.
tmp <- tibble::tibble(firststring = "GAD", secondstring = "AB")
(tmp_new <- glue::glue_data(tmp, "{firststring},{secondstring}"))
#> GAD,AB
Создано 2019-03-06 пакетом представлением (v0.2.1)
Да, для простого примера в этом вопросе это излишне, но для многих ситуаций это просто. (см. https://glue.tidyverse.org/)
Быстрый пример по сравнению с paste
с with
ниже. glue
код был немного легче набирать и выглядит немного легче для чтения.
tmp <- tibble::tibble(firststring = c("GAD", "GAD2", "GAD3"), secondstring = c("AB1", "AB2", "AB3"))
(tmp_new <- glue::glue_data(tmp, "{firststring} and {secondstring} went to the park for a walk. {firststring} forgot his keys."))
#> GAD and AB1 went to the park for a walk. GAD forgot his keys.
#> GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys.
#> GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys.
(with(tmp, paste(firststring, "and", secondstring, "went to the park for a walk.", firststring, "forgot his keys.")))
#> [1] "GAD and AB1 went to the park for a walk. GAD forgot his keys."
#> [2] "GAD2 and AB2 went to the park for a walk. GAD2 forgot his keys."
#> [3] "GAD3 and AB3 went to the park for a walk. GAD3 forgot his keys."
Создано 2019-03-06 пакетом представлением (v0.2.1)
Еще один не вставленный ответ:
x <- capture.output(cat(data, sep = ","))
x
[1] "GAD,AB"
куда
data <- c("GAD", "AB")