Moim zdaniem sprintf
funkcja -funkcja również zasługuje na miejsce wśród tych odpowiedzi. Możesz użyć sprintf
w następujący sposób:
do.call(sprintf, c(d[cols], '%s-%s-%s'))
co daje:
[1] "a-d-g" "b-e-h" "c-f-i"
Aby utworzyć wymaganą ramkę danych:
data.frame(a = d$a, x = do.call(sprintf, c(d[cols], '%s-%s-%s')))
dający:
a x
1 1 a-d-g
2 2 b-e-h
3 3 c-f-i
Chociaż sprintf
nie ma wyraźnej przewagi nad kombinacją do.call
/ paste
@BrianDiggs, jest szczególnie przydatna, gdy chcesz również dopełnić określone części żądanego ciągu lub gdy chcesz określić liczbę cyfr. Zobacz ?sprintf
kilka opcji.
Innym wariantem byłoby użycie pmap
frommruczenie:
pmap(d[2:4], paste, sep = '-')
Uwaga: to pmap
rozwiązanie działa tylko wtedy, gdy kolumny nie są czynnikami.
Wzorzec dla większego zbioru danych:
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)
prowadzi do:
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
Wykorzystane dane:
d <- data.frame(a = 1:3, b = c('a','b','c'), c = c('d','e','f'), d = c('g','h','i'))