Kanımca sprintf
fonksiyon bu cevaplar arasında da bir yeri hak ediyor. Aşağıdaki gibi kullanabilirsiniz sprintf
:
do.call(sprintf, c(d[cols], '%s-%s-%s'))
hangi verir:
[1] "a-d-g" "b-e-h" "c-f-i"
Ve gerekli veri çerçevesini oluşturmak için:
data.frame(a = d$a, x = do.call(sprintf, c(d[cols], '%s-%s-%s')))
veren:
a x
1 1 a-d-g
2 2 b-e-h
3 3 c-f-i
Her ne kadar sprintf
üzerinde açık bir avantaja sahip değildir do.call
/ paste
@BrianDiggs kombinasyonu size hane sayısını belirtmek istediğinizde, özellikle de istenen dize ped belirli bölümlerine istediğinizde kullanılan yaklaşımlar veya. ?sprintf
Çeşitli seçenekler için bakın .
Bir başka varyant kullanmak olacaktır pmap
danmırlamak:
pmap(d[2:4], paste, sep = '-')
Not: Bu pmap
çözüm yalnızca sütunlar faktör olmadığında işe yarar.
Daha büyük bir veri kümesinde bir kıyaslama:
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)
sonuçlanır:
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
Kullanılan veriler:
d <- data.frame(a = 1:3, b = c('a','b','c'), c = c('d','e','f'), d = c('g','h','i'))