Meiner Meinung nach sprintf
verdient die Funktion auch einen Platz unter diesen Antworten. Sie können sprintf
wie 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 sprintf
dies 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 ?sprintf
für die verschiedenen Optionen.
Eine andere Variante wäre die Verwendung pmap
vonpurrr::
pmap(d[2:4], paste, sep = '-')
Hinweis: Diese pmap
Lö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'))