2016-03-25 13 views
0

özür dilemelerinde seçilen satırların toplamı olan yeni satır girdisi oluşturun ... Soruyu sormak için bu soruyu sormak zor buldum, çok daha az arama!Eğer önceden sorulmuşsa R

Bu benim ile çalışıyorum verinin türü daha küçük bir örnektir:

> df <- data.frame("ID"=c("A1","A1","A1","A1","A2","A2","A2","A3","A3","A3","A3"), 
      "Cat"=c("corn","wheat","quarry","barley","corn","wheat","lake","corn","wheat","quarry","rye"), 
      "Count"=c(3,1,3,4,5,2,4,7,2,9,1)) 

> df 
    ID Cat Count 
1 A1 corn  3 
2 A1 wheat  1 
3 A1 quarry  3 
4 A1 barley  4 
5 A2 corn  5 
6 A2 wheat  2 
7 A2 lake  4 
8 A3 corn  7 
9 A3 wheat  2 
10 A3 quarry  9 
11 A3 rye  1 

Ben yaklaşık iki düzine farklı kategori türleri için bir sayım girişi olan, her biri birkaç yüz farklı kimlikleri var. Her kimliğin her kategori için bir girişi olmaz. Yapmak istediğim, her benzersiz kimlik için diğer kategorilerin bir seçimini özetleyen yeni bir kategori türü oluşturmaktır. Örneğin, bu yukarıdaki verilerden çıkışı olacaktır: Yeni bir kategoride, "ekinler" mısır, buğday, arpa, çavdar ve bir arada eklemek istiyorsa ...

ID Cat Count 
1 A1 crops  8 
2 A1 quarry  3 
3 A2 crops  7 
4 A2 lake  4 
5 A3 crops 10 
6 A3 quarry  9 

ama taş ocağı dışlamak ve göl.

Bu veri çerçevesini ilk önce üretmek için "aggregate" öğesini başarılı bir şekilde kullandım, ancak birkaç satırın toplamı tarafından yapılmış tamamen yeni bir satır oluşturmanın bir yolunu bulmayı başaramadım. Kimlik Numarası.

Herhangi bir girdi için teşekkürler!

+0

Son satırın çıkışını kontrol edebilir misiniz? – akrun

+0

evet, iyi yakalama – Victoria

+0

Aşağıda iki çözüm gönderdim. Eğer işe yarıyorsa, lütfen oylamadan sonra onay işaretini tıklayarak çözümü kabul etmeyi düşünün. – akrun

cevap

2

data.table'u kullanabiliriz. 'Data.frame' öğesini 'data.table' haline getirin (setDT(df)). "Taş" veya "göl" olmayan, "Kedi" ve "Kimlik" ile gruplandırılmış öğeler için "Keçe" yi "mahsul" olarak atayın, "Kont" un sum değerini aldık.

library(data.table) 
setDT(df)[!(Cat %chin% c("quarry", "lake")), Cat := "crops"] 
df[, .(Count=sum(Count)),.(ID, Cat)] 
# ID Cat Count 
#1: A1 crops  8 
#2: A1 quarry  3 
#3: A2 crops  7 
#4: A2 lake  4 
#5: A3 crops 10 
#6: A3 quarry  9 

Ya base R kullanarak, biz "ocağı" veya "ekinler" ile "Göl" olmayan unsurları ing replace tarafından veri kümesi transform ve sonra aggregate "Kont" nin sum almak için gruplandırılmış "Kedi" ve "Kimlik" ile.

df1 <- transform(df, Cat = replace(as.character(Cat), 
     !(Cat %in% c("quarry", "lake")), "crops")) 
aggregate(Count~., df1, sum)