source

그룹당 여러 변수(예: 합, 평균) 집계/요약

factcode 2023. 6. 13. 22:51
반응형

그룹당 여러 변수(예: 합, 평균) 집계/요약

데이터 프레임에서 쉽게 집계할 수 있는 방법이 있습니까?sum,mean,max등) 여러 변수를 동시에 사용할 수 있습니까?

다음은 몇 가지 샘플 데이터입니다.

library(lubridate)
days = 365*2
date = seq(as.Date("2000-01-01"), length = days, by = "day")
year = year(date)
month = month(date)
x1 = cumsum(rnorm(days, 0.05)) 
x2 = cumsum(rnorm(days, 0.05))
df1 = data.frame(date, year, month, x1, x2)

나는 동시에 그것을 집계하고 싶습니다.x1그리고.x2의 변수df2데이터 프레임을 연도별 및 월별로 표시합니다.다음 코드는 다음을 집계합니다.x1변수, 그러나 동시에 집계하는 것도 가능합니까?x2변수?

### aggregate variables by year month
df2=aggregate(x1 ~ year+month, data=df1, sum, na.rm=TRUE)
head(df2)

예, 당신의formula,넌 할 수 있다.cbind집계할 숫자 변수:

aggregate(cbind(x1, x2) ~ year + month, data = df1, sum, na.rm = TRUE)
   year month         x1          x2
1  2000     1   7.862002   -7.469298
2  2001     1 276.758209  474.384252
3  2000     2  13.122369 -128.122613
...
23 2000    12  63.436507  449.794454
24 2001    12 999.472226  922.726589

?aggregate,그formula논쟁과 예시들.

dplyr 패키지를 사용하면 깔끔한 선택 언어를 사용하여 여러 변수를 집계할 수 있습니다.예제 데이터 집합의 경우 다음과 같이 수행할 수 있습니다.

library(dplyr)
set.seed(13)

# summarising all non-grouping variables
df1 %>% group_by(year, month) %>% summarise(across(everything(), n_distinct))

# summarising a specific set of non-grouping variables
df1 %>% group_by(year, month) %>% summarise(across(x1:x2, sum))
df1 %>% group_by(year, month) %>% summarise(across(c(x1, x2), sum))
df1 %>% group_by(year, month) %>% summarise(across(-date, sum))

# summarising a specific set of non-grouping variables using selection helpers:
df1 %>% group_by(year, month) %>% summarise(across(starts_with('x'), sum))
df1 %>% group_by(year, month) %>% summarise(across(matches('.*[0-9]'), sum))

# summarising a specific set of non-grouping variables based on condition (class)
df1 %>% group_by(year, month) %>% summarise(across(where(is.numeric), sum))

이 중 첫 번째를 제외한 모든 결과는 다음과 같습니다.

# A tibble: 24 × 4
# Groups:   year [2]
    year month     x1    x2
   <dbl> <dbl>  <dbl> <dbl>
 1  2000     1  131.   27.4
 2  2000     2   44.8 155. 
 3  2000     3   60.7 207. 
 4  2000     4  -11.5 379. 
 5  2000     5   64.0 441. 
 6  2000     6  -16.5 517. 
 7  2000     7  210.  530. 
 8  2000     8  112.  573. 
 9  2000     9 -129.  347. 
10  2000    10 -165.  444. 
# … with 14 more rows

선택한 열에 여러 기능을 적용할 수도 있습니다.

df1 %>% 
  group_by(year, month) %>% 
  summarise(across(x1:x2, list(sum = sum, avg = mean)))
# A tibble: 24 × 6
# Groups:   year [2]
    year month x1_sum x1_avg x2_sum x2_avg
   <dbl> <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
 1  2000     1  131.   4.24    27.4  0.884
 2  2000     2   44.8  1.54   155.   5.34 
 3  2000     3   60.7  1.96   207.   6.69 
 4  2000     4  -11.5 -0.385  379.  12.6  
 5  2000     5   64.0  2.06   441.  14.2  
 6  2000     6  -16.5 -0.550  517.  17.2  
 7  2000     7  210.   6.76   530.  17.1  
 8  2000     8  112.   3.60   573.  18.5  
 9  2000     9 -129.  -4.30   347.  11.6  
10  2000    10 -165.  -5.33   444.  14.3  
# … with 14 more rows

몇 가지 최종 참고 사항:

  • 기본적으로,summarise()그룹화의 마지막 수준을 삭제하므로 위의 모든 예제는 다음 기준으로 그룹화됩니다.year모든 그룹화를 삭제하려면 다음을 추가할 수 있습니다.ungroup()호출, 또는 집합.groups = "drop"에서summarise()불러.
  • dplyr 1.1.0 이후에는 다음과 같은 인수를 사용하여 요약 작업에 대한 그룹화를 지정할 수 있습니다.df1 %>% summarise(across(c(x1, x2), sum), .by = c(year, month))
  • across()또한 다음과 같은 다른 dplyr 동사와 함께 작동합니다.mutate()그리고.reframe().
  • 의 도입 이전across()dplyr 1.0.0을 사용하여 이러한 종류의 작업이 수행되었습니다.summarise_all(),summarise_at(),summarise_if()그리고 (더 일찍)summarise_each()이제 이러한 기능은 다음을 위해 대체되거나 사용되지 않습니다.across().

사용data.table빠른 패키지(대규모 데이터셋에 적합)

https://github.com/Rdatatable/data.table/wiki

library(data.table)
df2 <- setDT(df1)[, lapply(.SD, sum), by = .(year, month), .SDcols = c("x1","x2")]
setDF(df2) # convert back to dataframe

플라이어 패키지 사용

require(plyr)
df2 <- ddply(df1, c("year", "month"), function(x) colSums(x[c("x1", "x2")]))

Hmisc 패키지의 요약() 사용(내 예에서는 열 제목이 지저분하지만)

# need to detach plyr because plyr and Hmisc both have a summarize()
detach(package:plyr)
require(Hmisc)
df2 <- with(df1, summarize( cbind(x1, x2), by=llist(year, month), FUN=colSums))

여기가 어디야year()기능은?

당신은 또한 사용할 수 있습니다.reshape2이 작업에 대한 패키지:

require(reshape2)
df_melt <- melt(df1, id = c("date", "year", "month"))
dcast(df_melt, year + month ~ variable, sum)
#  year month         x1           x2
1  2000     1  -80.83405 -224.9540159
2  2000     2 -223.76331 -288.2418017
3  2000     3 -188.83930 -481.5601913
4  2000     4 -197.47797 -473.7137420
5  2000     5 -259.07928 -372.4563522

흥미롭게도, 기본 Raggregatedata.frame메소드는 여기에 나와 있지 않습니다. 공식 인터페이스 위에 사용되므로 완전성을 위해 다음을 수행합니다.

aggregate(
  x = df1[c("x1", "x2")],
  by = df1[c("year", "month")],
  FUN = sum, na.rm = TRUE
)

aggregate의 data.frame 메서드를 보다 일반적으로 사용:

우리가 제공하고 있기 때문에

  • data.frame~하듯이x그리고.
  • a list(data.frame또한list) 로서by이것은 동적인 방식으로 사용해야 할 경우 매우 유용합니다. 예를 들어, 다른 열을 사용하여 집계하고 집계하는 것은 매우 간단합니다.
  • 맞춤형 집계 기능도 제공합니다.

예를 들어 다음과 같습니다.

colsToAggregate <- c("x1")
aggregateBy <- c("year", "month")
dummyaggfun <- function(v, na.rm = TRUE) {
  c(sum = sum(v, na.rm = na.rm), mean = mean(v, na.rm = na.rm))
}

aggregate(df1[colsToAggregate], by = df1[aggregateBy], FUN = dummyaggfun)

와 함께dplyr= 버전 > 전1.0.0우리는 또한 사용할 수 있습니다.summarise 열함 적방법는으로 여러 across

library(dplyr)
df1 %>% 
    group_by(year, month) %>%
    summarise(across(starts_with('x'), sum))
# A tibble: 24 x 4
# Groups:   year [2]
#    year month     x1     x2
#   <dbl> <dbl>  <dbl>  <dbl>
# 1  2000     1   11.7  52.9 
# 2  2000     2  -74.1 126.  
# 3  2000     3 -132.  149.  
# 4  2000     4 -130.    4.12
# 5  2000     5  -91.6 -55.9 
# 6  2000     6  179.   73.7 
# 7  2000     7   95.0 409.  
# 8  2000     8  255.  283.  
# 9  2000     9  489.  331.  
#10  2000    10  719.  305.  
# … with 14 more rows

은 데이통대유 빠접고른은을 하십시오.collapCRAN에서 사용할 수 있는 접힘 R 패키지의 함수:

library(collapse)
# Simple aggregation with one function
head(collap(df1, x1 + x2 ~ year + month, fmean))

  year month        x1        x2
1 2000     1 -1.217984  4.008534
2 2000     2 -1.117777 11.460301
3 2000     3  5.552706  8.621904
4 2000     4  4.238889 22.382953
5 2000     5  3.124566 39.982799
6 2000     6 -1.415203 48.252283

# Customized: Aggregate columns with different functions
head(collap(df1, x1 + x2 ~ year + month, 
      custom = list(fmean = c("x1", "x2"), fmedian = "x2")))

  year month  fmean.x1  fmean.x2 fmedian.x2
1 2000     1 -1.217984  4.008534   3.266968
2 2000     2 -1.117777 11.460301  11.563387
3 2000     3  5.552706  8.621904   8.506329
4 2000     4  4.238889 22.382953  20.796205
5 2000     5  3.124566 39.982799  39.919145
6 2000     6 -1.415203 48.252283  48.653926

# You can also apply multiple functions to all columns
head(collap(df1, x1 + x2 ~ year + month, list(fmean, fmin, fmax)))

  year month  fmean.x1    fmin.x1  fmax.x1  fmean.x2   fmin.x2  fmax.x2
1 2000     1 -1.217984 -4.2460775 1.245649  4.008534 -1.720181 10.47825
2 2000     2 -1.117777 -5.0081858 3.330872 11.460301  9.111287 13.86184
3 2000     3  5.552706  0.1193369 9.464760  8.621904  6.807443 11.54485
4 2000     4  4.238889  0.8723805 8.627637 22.382953 11.515753 31.66365
5 2000     5  3.124566 -1.5985090 7.341478 39.982799 31.957653 46.13732
6 2000     6 -1.415203 -4.6072295 2.655084 48.252283 42.809211 52.31309

# When you do that, you can also return the data in a long format
head(collap(df1, x1 + x2 ~ year + month, list(fmean, fmin, fmax), return = "long"))

  Function year month        x1        x2
1    fmean 2000     1 -1.217984  4.008534
2    fmean 2000     2 -1.117777 11.460301
3    fmean 2000     3  5.552706  8.621904
4    fmean 2000     4  4.238889 22.382953
5    fmean 2000     5  3.124566 39.982799
6    fmean 2000     6 -1.415203 48.252283

참고: 다음과 같은 기본 기능을 사용할 수 있습니다.mean, max이 붙은 등collap,그렇지만fmean, fmax등은 축소 패키지에서 제공되는 C++ 기반의 그룹화된 기능으로, 훨씬 더 빠름(즉, 대규모 데이터 집계의 성능은 data.table과 동일함)을 제공하는 동시에 더 큰 유연성을 제공하며, 이러한 빠른 그룹화된 기능도 사용할 수 있습니다.collap).

참고 2:collap 유연한 집계도 하며, "" " " " 를 할 수 . 물론 이를 사용하여custom및도 있습니다. 그러나 다음과 같은 반자동 방식으로 숫자 및 비숫자 열에 함수를 적용할 수도 있습니다.

# wlddev is a data set of World Bank Indicators provided in the collapse package
head(wlddev)

      country iso3c       date year decade     region     income  OECD PCGDP LIFEEX GINI       ODA
1 Afghanistan   AFG 1961-01-01 1960   1960 South Asia Low income FALSE    NA 32.292   NA 114440000
2 Afghanistan   AFG 1962-01-01 1961   1960 South Asia Low income FALSE    NA 32.742   NA 233350000
3 Afghanistan   AFG 1963-01-01 1962   1960 South Asia Low income FALSE    NA 33.185   NA 114880000
4 Afghanistan   AFG 1964-01-01 1963   1960 South Asia Low income FALSE    NA 33.624   NA 236450000
5 Afghanistan   AFG 1965-01-01 1964   1960 South Asia Low income FALSE    NA 34.060   NA 302480000
6 Afghanistan   AFG 1966-01-01 1965   1960 South Asia Low income FALSE    NA 34.495   NA 370250000

# This aggregates the data, applying the mean to numeric and the statistical mode to categorical columns
head(collap(wlddev, ~ iso3c + decade, FUN = fmean, catFUN = fmode))

  country iso3c       date   year decade                     region      income  OECD    PCGDP   LIFEEX GINI      ODA
1   Aruba   ABW 1961-01-01 1962.5   1960 Latin America & Caribbean  High income FALSE       NA 66.58583   NA       NA
2   Aruba   ABW 1967-01-01 1970.0   1970 Latin America & Caribbean  High income FALSE       NA 69.14178   NA       NA
3   Aruba   ABW 1976-01-01 1980.0   1980 Latin America & Caribbean  High income FALSE       NA 72.17600   NA 33630000
4   Aruba   ABW 1987-01-01 1990.0   1990 Latin America & Caribbean  High income FALSE 23677.09 73.45356   NA 41563333
5   Aruba   ABW 1996-01-01 2000.0   2000 Latin America & Caribbean  High income FALSE 26766.93 73.85773   NA 19857000
6   Aruba   ABW 2007-01-01 2010.0   2010 Latin America & Caribbean  High income FALSE 25238.80 75.01078   NA       NA

# Note that by default (argument keep.col.order = TRUE) the column order is also preserved

된 업트됨이dplyr: since 션루 : 이후dplyr 1.1.0에서 사용할 수 있습니다.summarise를 수행합니다(으로 인라임자수다니행합로으를동그룹화시인자▁((▁to다▁automaticallywhich).ungroup계산 후 s).

용사를 합니다.across에서 사용 가능)dplyr 1.0.0할 수 을 사용하면 여러 열에 대해 동일한 기능을 동시에 사용할 수 있습니다.

library(dplyr)
df1 %>%
  summarise(across(starts_with('x'), sum), .by = c(year, month))

# A tibble: 24 x 4
#    year month     x1     x2
#   <dbl> <dbl>  <dbl>  <dbl>
# 1  2000     1   11.7  52.9 
# 2  2000     2  -74.1 126.  
# 3  2000     3 -132.  149.  
# 4  2000     4 -130.    4.12
# 5  2000     5  -91.6 -55.9 
# 6  2000     6  179.   73.7 
# 7  2000     7   95.0 409.  
# 8  2000     8  255.  283.  
# 9  2000     9  489.  331.  
#10  2000    10  719.  305.  
# … with 14 more rows

다음은 여러 열을 요약하는 또 다른 방법으로, 함수에 추가 인수가 필요할 때 특히 유용합니다.다음을 통해 모든 열을 선택할 수 있습니다.everything() 또같은열 부집합과 같은 집합입니다.any_of(c("a", "b")).

library(dplyr)
# toy data
df <- tibble(a = sample(c(NA, 5:7), 30, replace = TRUE), 
             b = sample(c(NA, 1:5), 30, replace = TRUE), 
             c = sample(1:5, 30, replace = TRUE), 
             grp = sample(1:3, 30, replace = TRUE))
df
#> # A tibble: 30 × 4
#>        a     b     c   grp
#>    <int> <int> <int> <int>
#>  1     7     1     3     1
#>  2     7     4     4     2
#>  3     5     1     3     3
#>  4     7    NA     3     2
#>  5     7     2     5     2
#>  6     7     4     4     2
#>  7     7    NA     3     3
#>  8    NA     5     4     1
#>  9     5     1     1     2
#> 10    NA     3     1     2
#> # … with 20 more rows
df %>% 
  group_by(grp) %>%
  summarise(across(everything(), 
                   list(mean = ~mean(., na.rm = TRUE),
                        q75 = ~quantile(., probs = .75, na.rm = TRUE))))
#> # A tibble: 3 × 7
#>     grp a_mean a_q75 b_mean b_q75 c_mean c_q75
#>   <int>  <dbl> <dbl>  <dbl> <dbl>  <dbl> <dbl>
#> 1     1   6.6      7   2.88  4.25   3        4
#> 2     2   6.33     7   2.62  3.25   2.9      4
#> 3     3   5.78     6   3.33  4      3.09     4

파티에 늦었지만 최근에 요약 통계를 얻을 수 있는 다른 방법을 찾았습니다.

library(psych) describe(data)

Will 출력: 평균, 최소값, 최대값, 표준 편차, n, 표준 오차, 첨도, 왜도, 중위수 및 각 변수에 대한 범위.

언급URL : https://stackoverflow.com/questions/9723208/aggregate-summarize-multiple-variables-per-group-e-g-sum-mean

반응형