На мой взгляд, 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
решение работает только тогда, когда столбцы не являются факторами.
Тест на большом наборе данных:
d2 <- d[sample(1:3,1e6,TRUE),]
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'))