Soru Her gruptaki satır sayısını sayın


Bir veri çerçevem ​​var ve her gruptaki satır sayısını saymak istiyorum. Ben düzenli olarak aggregate verileri aşağıdaki gibi toplamak için işlev:

df2 <- aggregate(x ~ Year + Month, data = df1, sum)

Şimdi, gözlemleri saymak istiyorum, ancak uygun argümanı bulamıyorum. FUN. Sezgisel olarak şöyle olacağını düşündüm:

df2 <- aggregate(x ~ Year + Month, data = df1, count)

Ama böyle bir şans yok.

Herhangi bir fikir?


Bazı oyuncak verileri:

set.seed(2)
df1 <- data.frame(x = 1:20,
                  Year = sample(2012:2014, 20, replace = TRUE),
                  Month = sample(month.abb[1:3], 20, replace = TRUE))

76
2018-03-21 16:50


Menşei


nrow, NROW, length... - Joshua Ulrich
Bu soruyu, bir şeyler saymanın eğlenceli bir yolunu (sanki birçok aksayan yoldan farklı olarak) soruyorum. - Hong Ooi
@JoshuaUlrich: nrow benim için çalışmadı ama NROW ve lengthiyi çalıştı. +1 - Prolix


Cevaplar:


Ayrıca birde şu var df2 <- count(x, c('Year','Month')) (plyr paketi)


37
2018-06-05 13:48



Bir değişkeni bir araya getirmenin ve saymanın da bir yolu var mı (toplamada 2 işlev gibi: ortalama + sayım)? Bir sütunun ortalamasını ve aynı değerdeki satır sayısını diğer sütunda almam gerekiyor - sop
İD cbind Sonuçları aggregate(Sepal.Length ~ Species, iris, mean) ve aggregate(Sepal.Length ~ Species, iris, length) - geotheory
Bunu yaptım, ama toplanmış olan dışında her sütunun 2 katını aldığım görülüyor; Onları bir birleştirme yaptım ve ok gibi görünüyor - sop
Bilmiyorum ama bu da yararlı olabilir. df %>% group_by(group, variable) %>% mutate(count = n()) - Manoj Kumar
Evet dplyr şimdi en iyi uygulamadır. - geotheory


Joshua'nın önerisini takiben, burada gözlem sayınızı değerlendirmenin bir yolu var. df dataframe nerede Year = 2007 ve Month = Kasım (sütun olduklarını varsayarsak):

nrow(df[,df$YEAR == 2007 & df$Month == "Nov"])

Ve birlikte aggregate@GregSnow ardından:

aggregate(x ~ Year + Month, data = df, FUN = length)

51
2018-03-21 17:06





Biz de kullanabilirsiniz dplyr.

İlk önce, bazı veriler:

df <- data.frame(x = rep(1:6, rep(c(1, 2, 3), 2)), year = 1993:2004, month = c(1, 1:11))

Şimdi sayım:

library(dplyr)
count(df, year, month)
#piping
df %>% count(year, month)

Borulama ve biraz daha uzun bir versiyon da kullanabiliriz. n() fonksiyon:

df %>% 
  group_by(year, month) %>%
  summarise(number = n())

veya tweet işlevi:

df %>% 
  group_by(year, month) %>%
  tally()

27
2017-08-12 21:55





Olmadan eski bir soru data.table çözüm. Yani işte gidiyor ...

kullanma .N 

library(data.table)
DT <- data.table(df)
DT[, .N, by = list(year, month)]

25
2017-08-02 00:30





İle kullanmak için basit bir seçenek aggregate öyle mi length alt kümedeki vektörün uzunluğunu verecek işlev. Bazen biraz daha sağlam kullanmak function(x) sum( !is.na(x) ).


20
2018-03-21 18:08





Yeni bir değişken oluştur Count her satır için 1 değeri ile:

df1["Count"] <-1

Ardından, veri toplamasını toplayın. Count sütun:

df2 <- aggregate(df1[c("Count")], by=list(year=df1$year, month=df1$month), FUN=sum, na.rm=TRUE)

16
2017-08-02 00:16





Bir alternatif aggregate() Bu durumda işlev table() ile as.data.frame()Aynı zamanda, Yılın ve Ayın hangi kombinasyonlarının sıfır oluşumla ilişkilendirileceğini de gösterir

df<-data.frame(x=rep(1:6,rep(c(1,2,3),2)),year=1993:2004,month=c(1,1:11))

myAns<-as.data.frame(table(df[,c("year","month")]))

Ve sıfır oluşumlu kombinasyonlar olmadan

myAns[which(myAns$Freq>0),]

14
2018-03-21 20:41





Topluluğum için genellikle ortalama ve "bu grup ne kadar büyük" (a.k.a.) boyu görmek istiyorlar. Yani bu, bu durumlar için kullanışlı snippet'im;

agg.mean <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="mean")
agg.count <- aggregate(columnToMean ~ columnToAggregateOn1*columnToAggregateOn2, yourDataFrame, FUN="length")
aggcount <- agg.count$columnToMean
agg <- cbind(aggcount, agg.mean)

3
2018-01-05 16:38





bir  kullanarak çözüm sqldf paketi:

library(sqldf)
sqldf("SELECT Year, Month, COUNT(*) as Freq
       FROM df1
       GROUP BY Year, Month")

1
2018-05-29 19:22