각 그룹 내 행 수 계산


121

데이터 프레임이 있고 각 그룹 내의 행 수를 계산하고 싶습니다. aggregate다음과 같이 데이터를 합산 하기 위해 함수를 다시 사용합니다 .

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

이제 관측 값을 세고 싶지만 .NET에 대한 적절한 인수를 찾을 수없는 것 같습니다 FUN. 직관적으로 다음과 같을 것이라고 생각했습니다.

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

그러나 그런 행운은 없습니다.

어떤 아이디어?


일부 장난감 데이터 :

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))

17
nrow, NROW, length...
여호수아 울리히

15
나는이 질문을 재미있는 방법으로 계산하는 것으로 계속 읽고 있습니다 (많은 재미없는 방법과는 반대로).
홍콩 오오이

6
@JoshuaUlrich는 : nrow나를 위해 일하지만하지 않았다 NROWlength일을 잘. +1
Prolix 2015-08-11

답변:


69

현재 모범 사례 (tidyverse)는 다음과 같습니다.

require(dplyr)
df1 %>% count(Year, Month)

변수를 집계하고 계산하는 방법도 있습니까 (집계의 2 개 함수 : 평균 + 개수)? 다른 열의 동일한 값에 대해 열의 평균과 행 수를 구해야합니다
sop

1
나는 cbind결과 aggregate(Sepal.Length ~ Species, iris, mean)aggregate(Sepal.Length ~ Species, iris, length)
지리학

나는 그것을 해왔지만 집계 된 열을 제외하고 각 열에 2 번 얻는 것 같습니다. 그래서 나는 그들에 병합을했고 괜찮은 것 같습니다
sop

6
나도 몰라하지만이뿐만 아니라 유용 할 수 ...df %>% group_by(group, variable) %>% mutate(count = n())
마 노즈 쿠마르에게

1
예, dplyr은 이제 모범 사례입니다.
geotheory

67

@Joshua의 제안에 따라 다음 dfYear= 2007 및 Month= Nov (열이라고 가정) 인 데이터 프레임 의 관측치 수를 계산할 수있는 한 가지 방법입니다 .

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

aggregate@GregSnow를 따라 :

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

47

dplyr패키지는 count/ tally명령 또는 n()함수를 사용 하여이를 수행합니다 .

첫째, 일부 데이터 :

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

이제 카운트 :

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

파이프와 n()기능이 있는 약간 더 긴 버전을 사용할 수도 있습니다 .

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

또는 tally기능 :

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

37

data.table해결책이 없는 오래된 질문 . 그래서 여기 간다 ...

사용 .N

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

1
표준은 요즘 사용하는 .()대신에 list()하고 setDT()data.table에 data.frame을 변환 할 수 있습니다. 그래서 한 단계에서 setDT(df)[, .N, by = .(year, month)].
sindri_baldur

23

사용하는 간단한 옵션 은 하위 집합의 벡터 길이를 제공 aggregate하는 length함수입니다. 때로는 좀 더 강력하게 function(x) sum( !is.na(x) ).


18

Count각 행에 대해 값이 1 인 새 변수 를 만듭니다 .

df1["Count"] <-1

그런 다음 Count열로 합산하여 데이터 프레임을 집계합니다 .

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

기본값을 사용하는 경우 그냥 참고로, 비 공식 방법은 aggregate, 각 변수의 이름을 바꿀 필요가 없습니다 by=처럼 list(year=df1$year)등을하는 data.frameA는 list아직 aggregate(df1[c("Count")], by=df1[c("Year", "Month")], FUN=sum, na.rm=TRUE)작동은.
thelatemail 19

17

aggregate()이 경우 함수에 대한 대안 은 table()with 가 될 것 입니다 as.data.frame(). 이것은 또한 어떤 연도와 월의 조합이 0 번 발생과 연관되어 있는지를 나타냅니다.

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")]))

그리고 제로 발생 조합없이

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

7

데이터에서 누락 된 월-년에 대해 0 카운트를 포함하려면 약간의 table마법을 사용할 수 있습니다 .

data.frame(with(df1, table(Year, Month)))

예를 들어, 질문 df1의 장난감 data.frame에는 2014 년 1 월의 관측치가 없습니다.

df1
    x Year Month
1   1 2012   Feb
2   2 2014   Feb
3   3 2013   Mar
4   4 2012   Jan
5   5 2014   Feb
6   6 2014   Feb
7   7 2012   Jan
8   8 2014   Feb
9   9 2013   Mar
10 10 2013   Jan
11 11 2013   Jan
12 12 2012   Jan
13 13 2014   Mar
14 14 2012   Mar
15 15 2013   Feb
16 16 2014   Feb
17 17 2014   Mar
18 18 2012   Jan
19 19 2013   Mar
20 20 2012   Jan

기본 R aggregate함수는 2014 년 1 월에 대한 관측치를 반환하지 않습니다.

aggregate(x ~ Year + Month, data = df1, FUN = length)
  Year Month x
1 2012   Feb 1
2 2013   Feb 1
3 2014   Feb 5
4 2012   Jan 5
5 2013   Jan 2
6 2012   Mar 1
7 2013   Mar 3
8 2014   Mar 2

카운트가 0 인 이번 월-연도를 관찰하려는 경우 위 코드는 모든 월-연도 조합에 대한 카운트가있는 data.frame을 반환합니다.

data.frame(with(df1, table(Year, Month)))
  Year Month Freq
1 2012   Feb    1
2 2013   Feb    1
3 2014   Feb    5
4 2012   Jan    5
5 2013   Jan    2
6 2014   Jan    0
7 2012   Mar    1
8 2013   Mar    3
9 2014   Mar    2

5

내 집계의 경우 보통 평균과 "이 그룹이 얼마나 큰지"(일명 길이)를보고 싶어합니다. 그래서 이것은 그 경우에 대한 나의 편리한 스 니펫입니다.

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)

4

sqldf패키지를 사용하는 솔루션 :

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

1

@Ben 답변을 고려할 때 R에 열 df1이 없으면 오류가 발생합니다 x. 그러나 다음과 paste같이 우아하게 해결할 수 있습니다 .

aggregate(paste(Year, Month) ~ Year + Month, data = df1, FUN = NROW)

마찬가지로 그룹화에 두 개 이상의 변수가 사용되는 경우 일반화 할 수 있습니다.

aggregate(paste(Year, Month, Day) ~ Year + Month + Day, data = df1, FUN = NROW)

0

필요한 집계 목록을 생성하는 by함수를 사용할 수 있습니다 by(df1$Year, df1$Month, count).

출력은 다음과 같습니다.

df1$Month: Feb
     x freq
1 2012    1
2 2013    1
3 2014    5
--------------------------------------------------------------- 
df1$Month: Jan
     x freq
1 2012    5
2 2013    2
--------------------------------------------------------------- 
df1$Month: Mar
     x freq
1 2012    1
2 2013    3
3 2014    2
> 

0

이미 여기에 멋진 답변이 많이 있지만 해당 행이 반복되는 횟수를 포함하는 원래 데이터 세트에 새 열을 추가하려는 사람들을 위해 하나 이상의 옵션을 던지고 싶었습니다.

df1$counts <- sapply(X = paste(df1$Year, df1$Month), 
                     FUN = function(x) { sum(paste(df1$Year, df1$Month) == x) })

위의 답변을 merge()함수 와 결합하여 동일한 결과를 얻을 수 있습니다 .


0

위의 집계 솔루션을 시도하고 오류가 발생하는 경우 :

변수에 대한 잘못된 유형 (목록)

날짜 또는 날짜 / 시간 스탬프를 사용하고 있으므로 변수에 as.character를 사용해보십시오.

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

변수 중 하나 또는 둘 다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.