Grupları orijinal sırada tutarken bir veri çerçevesini toplamakta sorun yaşıyorum (veri çerçevesindeki ilk görünüme göre sırayla). Onu doğru şekilde başarmayı başardım, ama bunun için daha kolay bir yol olduğunu umuyordum.Orijinal siparişi koruyarak toplu veri çerçevesi, basit bir şekilde
set.seed(7)
sel.1 <- sample(1:5, 20, replace = TRUE) # selection vector 1
sel.2 <- sample(1:5, 20, replace = TRUE)
add.1 <- sample(81:100) # additional vector 1
add.2 <- sample(81:100)
orig.df <- data.frame(sel.1, sel.2, add.1, add.2)
Bazı noktalara Not: Burada
üzerinde çalışmak için ayarlanmış örnek bir veri olduğunu veri gruplanmış nasıl belirlemek için iki seçim sütun yer almaktadır. Aynı olacaklar ve isimleri biliniyor. Bu verilere sadece iki tane ek sütun koydum, ama daha fazlası olabilir. Takip etmeyi kolaylaştırmak için 'sel' ve 'add' ile başlayan sütun adlarını verdim, ancak asıl veriler farklı isimlere sahip (bu yüzdengrep
püf noktaları güzelken, burada yararlı olmayacaklar).
Yapmaya çalıştığım şey, veri çerçevesini 'sel' sütunlarına göre gruplara ayırmak ve tüm 'add' sütunlarını bir araya toplamaktır. aşağıdaki gibi yeterince basit aggregate
kullanıyor:
# Get the names of all the additional columns
all.add <- names(orig.df)[!(names(orig.df)) %in% c("sel.1", "sel.2")]
aggr.df <- aggregate(orig.df[,all.add],
by=list(sel.1 = orig.df$sel.1, sel.2 = orig.df$sel.2), sum)
sorun sonucu 'sel' sütunlarında tarafından sipariş olmasıdır; Her grubun orijinal verilerine göre ilk görünümüne göre sıralanmasını istiyorum. Bu bana doğru sonucu verir iken Birinin basit bir çözüm işaret umuyorum,
## Attempt 1
# create indices for each row (x) and find the minimum index for each range
index.df <- aggregate(x = 1:nrow(orig.df),
by=list(sel.1 = orig.df$sel.1, sel.2 = orig.df$sel.2), min)
# Make sure the x vector (indices) are in the right range for aggr.df
index.order <- (1:nrow(index.df))[order(index.df$x)]
aggr.df[index.order,]
## Attempt 2
# get the unique groups. These are in the right order.
unique.sel <- unique(orig.df[,c("sel.1", "sel.2")])
# use sapply to effectively loop over data and sum additional columns.
sums <- t(sapply(1:nrow(unique.sel), function (x) {
sapply(all.add, function (y) {
sum(aggr.df[which(aggr.df$sel.1 == unique.sel$sel.1[x] &
aggr.df$sel.2 == unique.sel$sel.2[x]), y])
})
}))
data.frame(unique.sel, sums)
: Burada
bu işi yapmak benim en iyi çabalarıdır. Çözüm, standart R kurulumu ile gelen paketlerle çalışıyorsa tercih edilebilir.Ben aggregate
ve match
belgelerine baktım ama bir cevap (Ben aggregate
için bir "keep.original.order" parametresi gibi bir şey için umuyordum sanırım) bulamadık.
Herhangi bir yardım çok takdir edilecektir!
Güncelleme:
unique(data.frame(sapply(names(orig.df), function(x){
if(x %in% c("sel.1", "sel.2")) orig.df[,x] else
ave(orig.df[,x], orig.df$sel.1, orig.df$sel.2, FUN=sum)},
simplify=FALSE)))
sayesinde bu belki data.table kullanmanın en güzel çözüm kısadır. R geliştirme ekibinin, toplu olarak 'keep.original.order' parametresini nasıl uygulayacağı daha pişkin? Bu açık bir gözetim gibi görünüyor .. –