그룹당 여러 변수(예: 합, 평균) 집계/요약
데이터 프레임에서 쉽게 집계할 수 있는 방법이 있습니까?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
흥미롭게도, 기본 Raggregate
의data.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
은 데이통대유 빠접고른은을 하십시오.collap
CRAN에서 사용할 수 있는 접힘 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
'source' 카테고리의 다른 글
암호 확인을 위한 데이터 주석 (0) | 2023.06.13 |
---|---|
Flutter : 코드의 각 목록 항목 사이에 구분자를 추가하려면 어떻게 해야 합니까? (0) | 2023.06.13 |
Linux에서 pid_t, uid_t, gid_t의 크기 (0) | 2023.06.13 |
대형 R 프로그램을 어떻게 구성합니까? (0) | 2023.06.13 |
루비 전송 vs __send__ (0) | 2023.06.13 |