На мій погляд, 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
Хоча sprintf
не має однозначної переваги над do.call
/ paste
комбінацією @BrianDiggs, це особливо корисно, коли ви також хочете заповнити певні частини бажаного рядка або коли ви хочете вказати кількість цифр. Дивіться ?sprintf
кілька варіантів.
Іншим варіантом буде використання pmap
змуркотіти:
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'))