Hoe kunnen twee strings aaneengeschakeld worden?

Hoe kan ik twee waarden samenvoegen (samenvoegen, combineren)?
Ik heb bijvoorbeeld:

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

Mijn doel is om de twee waarden in “tmp” samen te voegen tot één string:

tmp_new = "GAD,AB"

Welke functie kan dit voor mij doen?


Antwoord 1, autoriteit 100%

paste()

is de juiste keuze. Zoals de vorige posters al aangaven, kan plakken twee dingen doen:

waarden samenvoegen tot één “tekenreeks”, bijv.

> paste("Hello", "world", sep=" ")
[1] "Hello world"

waarbij het argument sephet teken/de tekens specificeert die moeten worden gebruikt tussen de argumenten die moeten worden samengevoegd,
of teken vectoren samenvouwen

> x <- c("Hello", "World")
> x
[1] "Hello" "World"
> paste(x, collapse="--")
[1] "Hello--World"

waarbij het argument collapsehet teken/de tekens specificeert die moeten worden gebruikt tussen de elementen van de vector die moet worden samengevouwen.

Je kunt zelfs beide combineren:

> paste(x, "and some more", sep="|-|", collapse="--")
[1] "Hello|-|and some more--World|-|and some more"

Hopelijk helpt dit.


Antwoord 2, autoriteit 16%

help.search()is een handige functie, b.v.

> help.search("concatenate")

leidt u naar paste().


Antwoord 3, autoriteit 9%

Voor het eerste niet-paste()-antwoord kunnen we kijken naar stringr::str_c()(en dan toString()onderstaand). Het bestaat nog niet zo lang als deze vraag, dus ik denk dat het nuttig is om te vermelden dat het ook bestaat.

Zeer eenvoudig te gebruiken, zoals je kunt zien.

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

Vanuit de beschrijving van het documentatiebestand past het goed bij dit probleem.

Om te begrijpen hoe str_c werkt, moet je je voorstellen dat je een matrix van strings opbouwt. Elk invoerargument vormt een kolom en wordt uitgebreid tot de lengte van het langste argument, met behulp van de gebruikelijke regels voor hergebruik. De sep-tekenreeks wordt tussen elke kolom ingevoegd. Als samenvouwen NULL is, wordt elke rij samengevouwen tot een enkele tekenreeks. Als de string niet NULL is, wordt deze aan het einde van elke rij ingevoegd en wordt de hele matrix samengevouwen tot een enkele string.

Toegevoegd 13-4-2016: het is niet precies hetzelfde als de gewenste uitvoer (extra ruimte), maar ook niemand heeft het genoemd. toString()is in feite een versie van paste()met collapse = ", "hardcoded, dus je kunt het doen

toString(tmp)
# [1] "GAD, AB"

Antwoord 4, autoriteit 7%

Zoals anderen al hebben opgemerkt, is paste()de juiste keuze. Maar het kan vervelend worden om telkens als je het niet-standaard scheidingsteken wilt gebruiken paste(str1, str2, str3, sep='')te moeten typen.

Je kunt heel gemakkelijk wrapper-functies maken die het leven veel eenvoudiger maken. Als u bijvoorbeeld merkt dat u vaak strings zonder scheidingsteken aaneenvoegt, kunt u het volgende doen:

p <- function(..., sep='') {
    paste(..., sep=sep, collapse=sep)
}

of als je vaak strings van een vector wilt samenvoegen (zoals implode()van PHP):

implode <- function(..., sep='') {
     paste(..., collapse=sep)
}

Hiermee kunt u dit doen:

p('a', 'b', 'c')
#[1] "abc"
vec <- c('a', 'b', 'c')
implode(vec)
#[1] "abc"
implode(vec, sep=', ')
#[1] "a, b, c"

Ook is er de ingebouwde paste0, die hetzelfde doet als mijn implode, maar zonder aangepaste scheidingstekens toe te staan. Het is iets efficiënter dan paste().


Antwoord 5, autoriteit 6%

> tmp = paste("GAD", "AB", sep = ",")
> tmp
[1] "GAD,AB"

Ik vond dit van Google door te zoeken naar R concatenate strings: http://stat.ethz.ch/R-manual/R-patched/library/base/html/paste.html


Antwoord 6, autoriteit 6%

Als het uw doel is om rechtstreeks naar een bestand of stdout te gaan, kunt u ook catgebruiken:

cat(s1, s2, sep=", ")

Antwoord 7, autoriteit 4%

U kunt uw eigen operator maken:

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

U kunt ook de operator ‘and’ (&) opnieuw definiëren:

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

rommelen met de syntaxis van de basislijn is lelijk, maar dat geldt ook voor het gebruik van paste()/paste0(). Als je alleen met je eigen code werkt, kun je (bijna altijd) logische & andoperator met *en vermenigvuldigen van logische waarden in plaats van logische ‘and &’


Antwoord 8, autoriteit 4%

Een andere manier:

sprintf("%s you can add other static strings here %s",string1,string2)

Het is soms handiger dan de functie paste(). %sgeeft de plaats aan waar de subjectieve strings zullen worden opgenomen.

Merk op dat dit van pas zal komen als u een pad probeert te bouwen:

sprintf("/%s", paste("this", "is", "a", "path", sep="/"))

uitvoer

/this/is/a/path

Antwoord 9, autoriteit 3%

Gezien de matrix, tmp, die je hebt gemaakt:

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

Ik neem aan dat er een reden is waarom je een matrix maakt met cbind, in plaats van simpelweg:

tmp <- "GAD,AB"

Antwoord 10

Beschouw het geval waarin de tekenreeksen kolommen zijn en het resultaat een nieuwe kolom zou moeten zijn:

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

Sla desgewenst de subinstelling [c("a", "b")]over als alle kolommen moeten worden geplakt.

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

Antwoord 11

Nog een niet-plakken antwoord:

x <- capture.output(cat(data, sep = ","))
x
[1] "GAD,AB"

Waar

data <- c("GAD", "AB")

Antwoord 12

glueis een nieuwe functie, dataklasse en pakket dat is ontwikkeld als onderdeel van de tidyverse, met veel uitgebreide functionaliteit. Het combineert functies van plakken, sprintf en de vorige andere antwoorden.

tmp <- tibble::tibble(firststring = "GAD", secondstring = "AB")
(tmp_new <- glue::glue_data(tmp, "{firststring},{secondstring}"))
#> GAD,AB

Gemaakt op 2019-03-06 door het reprex-pakket(v0.2.1)

Ja, het is overdreven voor het eenvoudige voorbeeld in deze vraag, maar krachtig voor veel situaties. (zie https://glue.tidyverse.org/)

Snel voorbeeld vergeleken met pastemet withhieronder. De glue-code was iets gemakkelijker te typen en ziet er wat gemakkelijker te lezen uit.

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

Gemaakt op 2019-03-06 door het reprex-pakket(v0.2.1)

Other episodes