다른 수의 반환 값을 반환하는 다른 함수로 그룹화 된 데이터를 요약하는 방법은 무엇입니까?

mt1022

저는 그룹화 된 데이터 세트에서 작업 중이며 4 개의 요약 통계를 카운트, 평균, ci 하한, ci 상한의 4 개의 새 열로 추가하고 싶습니다.

평균, ci 하한, ci 상한을 다음과 같이 요약했습니다.

library(Hmisc)
library(dplyr)

# summarize count, mean, confidence intervals and make four new columns;
mtcars %>% group_by(vs, am) %>%
    do(
        as.data.frame(as.list(smean.cl.normal(.$mpg)))
    )
#      vs    am     Mean    Lower    Upper
#   <dbl> <dbl>    <dbl>    <dbl>    <dbl>
# 1     0     0 15.05000 13.28723 16.81277
# 2     0     1 19.75000 15.54295 23.95705
# 3     1     0 20.74286 18.45750 23.02822
# 4     1     1 28.37143 23.97129 32.77157

그러나 개수를 추가하면 새 열이 목록의 2 개 열이됩니다.

df <- mtcars %>% group_by(vs, am) %>%
    do(
        n = length(.$mpg),
        stats = smean.cl.normal(.$mpg)
    )

# # A tibble: 4 × 4
#      vs    am         n     stats
# * <dbl> <dbl>    <list>    <list>
# 1     0     0 <int [1]> <dbl [3]>
# 2     0     1 <int [1]> <dbl [3]>
# 3     1     0 <int [1]> <dbl [3]>
# 4     1     1 <int [1]> <dbl [3]>

내 원하는 출력은 다음과 같습니다.

#      vs    am     n     Mean    Lower    Upper
#   <dbl> <dbl> <int>    <dbl>    <dbl>    <dbl>
# 1     0     0    12 15.05000 13.28723 16.81277
# 2     0     1     6 19.75000 15.54295 23.95705
# 3     1     0     7 20.74286 18.45750 23.02822
# 4     1     1     7 28.37143 23.97129 32.77157

이것을 어떻게 편리하게 달성해야합니까?

미리 감사드립니다.


나는 또한 시도했다 :

mtcars %>% group_by(vs, am) %>%
    do(
        as.data.frame(as.list(c(length(.$mpg), smean.cl.normal(.$mpg))))
    )

# Source: local data frame [4 x 8]
# Groups: vs, am [4]
# 
# vs    am   X12     Mean    Lower    Upper    X6    X7
# <dbl> <dbl> <dbl>    <dbl>    <dbl>    <dbl> <dbl> <dbl>
# 1     0     0    12 15.05000 13.28723 16.81277    NA    NA
# 2     0     1    NA 19.75000 15.54295 23.95705     6    NA
# 3     1     0    NA 20.74286 18.45750 23.02822    NA     7
# 4     1     1    NA 28.37143 23.97129 32.77157    NA     7

이것은 이상한 결과를 제공합니다.

제이크 카우프

당신은하지 않고이 작업을 수행 할 수있는 do여러 사용하여 tidyverse패키지를, 즉 tidyr, dplyr, purrrbroom.

그 이유 do는 결국purrr

그렇습니다:

  1. 대와 오전으로 그룹화
  2. 목록 프레임에 mpg를 중첩합니다.
  3. 통계 열과 n 열을 목록 프레임으로 만듭니다.
  4. 목록 프레임을 별도의 행과 열로 중첩 해제합니다.
  5. 데이터 목록 프레임을 삭제하십시오.

smean.cl.normal3 단계에서 적절한 형식 을 얻으려면 몇 가지 마무리 작업을 수행해야합니다. 내 접근 방식은 출력을 깔끔한 데이터 프레임으로 변환 broom::tidy한 다음 tidyr::spread행을 열로 변환하는 것이 었습니다 . 각 대 / 암 그룹에 대한 적절한 깔끔한 형태입니다. 이 접근 방식은 개선 될 수 있으며 이러한 제안이 의견에 게시되기를 바랍니다.

library(Hmisc)
library(tidyverse)

mtcars %>% 
  group_by(vs, am) %>% 
  nest(mpg) %>% 
  mutate(stats = map(data, ~spread(tidy(smean.cl.normal(.x$mpg)), names, x)),
         n = map(data, nrow)) %>% 
  unnest(stats, n) %>% 
  select(-data) 

이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.

침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제

에서 수정
0

몇 마디 만하겠습니다

0리뷰
로그인참여 후 검토

관련 기사

Related 관련 기사

뜨겁다태그

보관