私の意見では、sprintf
関数もこれらの答えの中に位置するに値します。sprintf
次のように使用できます。
do.call(sprintf, c(d[cols], '%s-%s-%s'))
与える:
[1] "a-d-g" "b-e-h" "c-f-i"
必要なデータフレームを作成するには:
data.frame(a = d$a, x = do.call(sprintf, c(d[cols], '%s-%s-%s')))
与える:
a x
1 1 a-d-g
2 2 b-e-h
3 3 c-f-i
@BrianDiggsの/の組み合わせに勝るsprintf
明確な利点はありませんが、目的の文字列の特定の部分をパディングしたい場合や、桁数を指定したい場合に特に便利です。いくつかのオプションについては、を参照してください。do.call
paste
?sprintf
別のバリアントは、pmap
from purrrを使用することです:
pmap(d[2:4], paste, sep = '-')
注: このpmap
ソリューションは、列が因子でない場合にのみ機能します。
より大きなデータセットのベンチマーク:
# 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)
結果:
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
使用データ:
d <- data.frame(a = 1:3, b = c('a','b','c'), c = c('d','e','f'), d = c('g','h','i'))