2012-07-06 16 views

cevap

12

aggregate fonksiyonu yardımcı olmalıdır Bir çözüm bulurken:

dat = data.frame(title = c("title1", "title2", "title3"), 
       author = c("author1", "author2", "author3"), 
       customerID = c(1, 2, 1)) 
aggregate(dat[-3], by=list(dat$customerID), c) 
# Group.1 title author 
# 1  1 1, 3 1, 3 
# 2  2  2  2 

Ya da, sadece size veri çerçevesini oluşturuyor ve hemen hemen iyi gitmeye olduğunuzda stringsAsFactors = FALSE ekleyin emin olun.

aggregate(dat[-3], by=list(dat$customerID), c) 
# Group.1   title   author 
# 1  1 title1, title3 author1, author3 
# 2  2   title2   author2 
+0

Bu çalışmalara teşekkürler! –

+0

@HarryPalmer, takip sorunuzu anladığımdan emin değilim. "Aggregate" çıktısını başka bir nesneye atadığınızı varsayarak, "temp", "temp $ title" ifadesinin bir liste olacağını (bu liste gibi ('0' = c (" title1 "," title3 "),' 1' = "title2") 'Bu örnekte' title' ve 'author' sütunları listelenenler: Bu aradığınız şey bu mu? – A5C1D2H2I1M1N2O1R2T1

+0

Hmm Sanırım şimdi anladım, veri türleri konusunda kafam karıştı. daha fazla soru lütfen: Bir sütun/satır listesi öğesinde görünen çiftleri toplamadan sonra nasıl kaldırabilirim? Veri1'i denedim - benzersiz (data2 $ title) ama merak etmedim ki işe yaramadı. –

1

değil en iyi çözüm ama kolay anlaşılması:

df <- data.frame(author=LETTERS[1:5], title=LETTERS[1:5], id=c(1, 2, 1, 2, 3), stringsAsFactors=FALSE) 

uniqueIds <- unique(df$id) 

mergedDf <- df[1:length(uniqueIds),] 

for (i in seq(along=uniqueIds)) { 
    mergedDf[i, "id"] <- uniqueIds[i] 
    mergedDf[i, "author"] <- paste(df[df$id == uniqueIds[i], "author"], collapse=",") 
    mergedDf[i, "title"] <- paste(df[df$id == uniqueIds[i], "title"], collapse=",") 
} 

mergedDf 
# author title id 
#1 A,C A,C 1 
#2 B,D B,D 2 
#3  E  E 3 
+0

İyi, ama R gruplanmış verilerle başa çıkmak için birkaç dahili işlevi vardır: Veri zaten çarpanlarına iseniz, o zaman, ilk karaktere dönüştürmek için dat[c(1, 2)] = apply(dat[-3], 2, as.character) gibi bir şey kullanabilirsiniz. Bu durum için en iyisi 'aggregate (df [-3], by = liste (df $ id), c) ', ama' ile (df [-3], df $ id, c) 'de aynı şeyi verir. Sonuç, tamamen farklı bir biçimde. – A5C1D2H2I1M1N2O1R2T1

+0

@mrdwab: thx, veri karelerini çok sık kullanmıyorum ve 'aggregate' işlevini bilmiyordum. – sgibb

İlgili konular