source

각 그룹 내 행 수 카운트

itover 2023. 6. 6. 10:44
반응형

각 그룹 내 행 수 카운트

데이터 프레임이 있는데 각 그룹 내 행 수를 세고 싶습니다.나는 정기적으로 사용합니다.aggregate다음과 같이 데이터를 합하는 함수:

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

이제, 저는 관측치를 세고 싶지만, 적절한 주장을 찾을 수 없는 것 같습니다.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))

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

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

@Joshua의 제안에 따라, 여기 당신이 당신의 관찰의 수를 셀 수 있는 한 가지 방법이 있습니다.df데이터 프레임 위치Year2007년 및Month11월(열이라고 가정):

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

와 함께aggregate다음 @GregSnow:

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

dplyr 패키지는 / 명령 또는 다음 기능을 tally사용하여 이 작업을 수행합니다.

첫째, 일부 데이터:

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

질문이 없는 오래된 질문data.table해결책자, 이제...

사용..N

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

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

새 변수 생성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()이 경우의 기능은 다음과 같습니다.table()와 함께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),]

데이터에 누락된 월별 카운트를 0개 포함하려면 조금 사용할 수 있습니다.table마술.

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

예를 들어, 질문 df1의 toy 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

베이스 Raggregate함수는 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

제 집계에 대해 저는 보통 평균과 "이 그룹이 얼마나 큰지"(예: 길이)를 보고 싶어합니다.그래서 이것은 그 상황들을 위한 저의 유용한 단편입니다.

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)

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

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

사용.collapse짐을 꾸리다R

library(collapse)
library(magrittr)
df %>% 
    fgroup_by(year, month) %>%
    fsummarise(number = fNobs(x))
library(tidyverse)

df_1 %>%
  group_by(Year, Month) %>%
  summarise(count= n()) 

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

사용할 수 있습니다.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
> 

여기에는 이미 많은 훌륭한 답변이 있지만, 원래 데이터 세트에 해당 행이 반복되는 횟수를 포함하는 새 열을 추가하려는 사용자를 위해 옵션을 하나 더 추가하고 싶었습니다.

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

위의 답변 중 하나를 다음과 결합하여 동일하게 달성할 수 있습니다.merge()기능.

위의 집계 솔루션을 사용해 보면 다음과 같은 오류가 발생합니다.

변수의 유형(목록)이 잘못되었습니다.

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

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

변수 중 하나 또는 둘 다에 대해 입력합니다.

저는 주로 테이블 기능을 사용합니다.


df <- data.frame(a=rep(1:8,rep(c(1,2,3, 4),2)),year=2011:2021,month=c(1,3:10))

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

언급URL : https://stackoverflow.com/questions/9809166/count-number-of-rows-within-each-group

반응형