Meiner Meinung nach sprintfverdient die Funktion auch einen Platz unter diesen Antworten. Sie können sprintfwie folgt verwenden:
do.call(sprintf, c(d[cols], '%s-%s-%s'))
was gibt:
[1] "a-d-g" "b-e-h" "c-f-i"
Und um den erforderlichen Datenrahmen zu erstellen:
data.frame(a = d$a, x = do.call(sprintf, c(d[cols], '%s-%s-%s')))
Geben:
a x
1 1 a-d-g
2 2 b-e-h
3 3 c-f-i
Obwohl sprintfdies keinen klaren Vorteil gegenüber der do.call/ paste-Kombination von @BrianDiggs hat, ist es besonders nützlich, wenn Sie auch bestimmte Teile der gewünschten Zeichenfolge auffüllen oder die Anzahl der Ziffern angeben möchten. Siehe ?sprintffür die verschiedenen Optionen.
Eine andere Variante wäre die Verwendung pmapvonpurrr::
pmap(d[2:4], paste, sep = '-')
Hinweis: Diese pmapLösung funktioniert nur, wenn die Spalten keine Faktoren sind.
Ein Benchmark für einen größeren Datensatz:
# create a larger dataset
d2 <- d[sample(1:3,1e6,TRUE),]
# benchmark
library(microbenchmark)
microbenchmark(
docp = do.call(paste, c(d2[cols], sep="-")),
appl = apply( d2[, cols ] , 1 , paste , collapse = "-" ),
tidr = tidyr::unite_(d2, "x", cols, sep="-")$x,
docs = do.call(sprintf, c(d2[cols], '%s-%s-%s')),
times=10)
Ergebnisse in:
Unit: milliseconds
expr min lq mean median uq max neval cld
docp 214.1786 226.2835 297.1487 241.6150 409.2495 493.5036 10 a
appl 3832.3252 4048.9320 4131.6906 4072.4235 4255.1347 4486.9787 10 c
tidr 206.9326 216.8619 275.4556 252.1381 318.4249 407.9816 10 a
docs 413.9073 443.1550 490.6520 453.1635 530.1318 659.8400 10 b
Verwendete Daten:
d <- data.frame(a = 1:3, b = c('a','b','c'), c = c('d','e','f'), d = c('g','h','i'))