2015-09-05 18 views
6

Gruplama değişkenleri ve metin içeren satırlarım var. data.table'u kullanmak için, değişkenleri bir satırda n kere aynı olduğunda, metni yapıştırmak istiyorum. İşte Birden çok gruplama sıralı değişkenler tarafından metni daraltma ve yapıştırma

Ben ne:

 x y        z 
1: Pre A Lorem ipsum dolor sit amet, ac 
2: Pre C Maecenas netus in, lacus fames 
3: Pre C Conubia sed nulla dolor dui ap 
4: Pre A Eget laoreet eros in aliquet e 
5: Pre A Vestibulum quisque himenaeos p 
6: Post A Sed venenatis. Ante turpis ege 
7: Post A Ultricies ultricies eleifend m 
8: Post B Conubia in in sed etiam nec mo 
9: Post A Quam nec ex sodales dictum orc 
10: Post A Sed ante id pulvinar maximus s 

İstenilen çıktı:

 x y                z 
1 Pre A        Lorem ipsum dolor sit amet, ac 
2 Pre C Maecenas netus in, lacus fames Conubia sed nulla dolor dui ap 
3 Pre A Eget laoreet eros in aliquet e Vestibulum quisque himenaeos p 
4 Post A Sed venenatis. Ante turpis ege Ultricies ultricies eleifend m 
5 Post B        Conubia in in sed etiam nec mo 
6 Post A Quam nec ex sodales dictum orc Sed ante id pulvinar maximus s 

MWE:

library(data.table) 
library(stringi) 

set.seed(12) 
dat <- data.frame(
    x = rep(c("Pre", "Post"), each=5), 
    y = sample(LETTERS[1:3], 10, TRUE), 
    z = substring(stri_rand_lipsum(10), 1, 30), stringsAsFactors = FALSE 
) 

setDT(dat) 

cevap

9

Biz gruplama değişken oluşturmak için data.table devel sürümünden rleid kullanabilirsiniz ('gr') 'x' ve 'y' değişkenlerini temel alır. 'Gr' ile gruplandırılmış, 'x', 'y' ve paste 'z' öğelerinin ilk elemanını birlikte alırız.

library(data.table)#v1.9.5+ 
setDT(dat)[,list(x=x[1L], y= y[1L], z=paste(z, collapse = ' ')) , 
         by = .(gr=rleid(x,y))][, gr:= NULL][] 
#  x y                z 
#1: Pre A        Lorem ipsum dolor sit amet, ac 
#2: Pre C Maecenas netus in, lacus fames Conubia sed nulla dolor dui ap 
#3: Pre A Eget laoreet eros in aliquet e Vestibulum quisque himenaeos p 
#4: Post A Sed venenatis. Ante turpis ege Ultricies ultricies eleifend m 
#5: Post B        Conubia in in sed etiam nec mo 
#6: Post A Quam nec ex sodales dictum orc Sed ante id pulvinar maximus s 

NOT: geliştirme sürümünü yüklemek için Talimatlar here


olan biz paste sonra bitişik elemanları karşılaştırarak 'gr' değişken oluşturmak olacaktır geliştirme sürümünü kullanmıyorsanız Başka bir seçenek 'x' ve 'y' sütunlarını girerek daha önce olduğu gibi ilerleyin.

setDT(dat)[, gr:={gr= paste(x,y); cumsum(c(TRUE, gr[-1]!= gr[-.N]))}] 
res <- dat[, list(x=x[1L], y=y[1L], z=paste(z, collapse=' ')) , 
        by = gr][,gr:= NULL][] 
res 
#  x y                z 
#1: Pre A        Lorem ipsum dolor sit amet, ac 
#2: Pre C Maecenas netus in, lacus fames Conubia sed nulla dolor dui ap 
#3: Pre A Eget laoreet eros in aliquet e Vestibulum quisque himenaeos p 
#4: Post A Sed venenatis. Ante turpis ege Ultricies ultricies eleifend m 
#5: Post B        Conubia in in sed etiam nec mo 
#6: Post A Quam nec ex sodales dictum orc Sed ante id pulvinar maximus s 

Bu, orijinal veri kümesindeki 'gr' sütunu da atar. Orijinal yapıyı aynı tutmak için 'gr' değerini NULL'a atayabiliriz.

dat[, gr:= NULL] 

yerine x=x[1L], y= y[1L] durumu nedeniyle, 'x', 'y' ve 'gr' Grup değişkenleri olarak ve dönüş sadece 'z' sütunu kullanabilirsiniz.

res <- dat[,list(z=paste(z, collapse=' ')) ,.(x, y, gr)][, gr:= NULL][] 
dat[, gr:= NULL] 
+1

Güzel yanıt. Yine de, gr seçeneği ikinci seçenekte "dat" dan kaldırılmaz. – Frank

+1

@Frank Teşekkürler, farketmediniz. NULL'a atanarak 'gr 'kaldırıldı. – akrun

İlgili konular