2017-02-12 2 views
0

데이터 프레임이 몇 개 있습니다.데이터 프레임 목록이 하나의 테이블 통계 (최대, 최소, IQR, ...)를 가져옵니다.

IQR (Interquartile Range)과 함께 기본 통계를 하나의 테이블에 모두 표시해야합니다.

불행히도 summary 함수는 IQR을 반환하지 않습니다. 반면에 fivenum은 IQR을 반환하지만 데이터 프레임 목록에는 적용 할 수 없으므로 중간 값은 필요하지 않습니다.

removeXYcol <- function(df) 
{ 
    # removes coordinates 
    drops <- c("X","Y") 
    withoutXY<- df[,!(names(df) %in% drops)] 
    withoutXY 
} 

getStatsTable <- function(listOfDataFrames, df_names = NULL, digits_no = 2) 
{ 
    # returns table with statistics (together with IQR which is not returned by summary) 
    for (df in listOfDataFrames){ 
    df_data <- unlist(removeXYcol(df)) 

    minimum <- round(min(df_data,na.rm = TRUE),digits = digits_no) 
    maximum <- round(max(df_data, na.rm = TRUE),digits = digits_no) 
    average <- round(mean(df_data, na.rm = TRUE),digits = digits_no) 
    IQR_ <- round(IQR(df_data, na.rm = TRUE),digits = digits_no) 

    toReturn <- c(minimum, maximum, average, IQR_) 
    if (exists("myStats")) { 
     myStats <- rbind(myStats, toReturn) 
    } else { 
     myStats <- toReturn 
    } 

    } 
    colnames(myStats) <- c("minimum", "maximum", "average", "IQR") 
    if (is.null(df_names)) { 
    df_names <- seq(length(listOfDataFrames)) 
    } 
    rownames(myStats) <- df_names 
    return(myStats) 
} 

더 간단한 해결책이 없다 궁금 그러나 다음과 같이

내가 적절한 기능을 찾을 수 없습니다 때문에

, 내가 하나를 자신을 썼다.

답변

1

fivenum은 벡터를 취합니다. 목록 전체에 lapply이 있어야하고 data.frame에 lapply이 있어야합니다. 예 : data.frames 더 잘 형식의 목록을 반환

purrr::at_depth(list(mtcars, mtcars), 2, fivenum) 

## [[1]] 
## [[1]]$mpg 
## [1] 10.40 15.35 19.20 22.80 33.90 
## 
## [[1]]$cyl 
## [1] 4 4 6 8 8 
## ... 

더 관여 버전 :

lapply(list(mtcars, mtcars), function(df){lapply(df, fivenum)}) 

## [[1]] 
## [[1]]$mpg 
## [1] 10.40 15.35 19.20 22.80 33.90 
## 
## [[1]]$cyl 
## [1] 4 4 6 8 8 
## ... 

대안은 당신이 반복 할 목록의 레벨을 지정할 수있는 purrr::at_depth입니다 :

library(tidyverse) 

list(mtcars, mtcars) %>% 
    map(gather, var, val) %>% 
    map(group_by, var) %>% 
    map(summarise, 
     val = list(fivenum(val)), 
     label = list(c('min', 'q1', 'med', 'q3', 'max'))) %>% 
    map(unnest) %>% 
    map(spread, label, val) 

## [[1]] 
## # A tibble: 11 × 6 
##  var  max  med min  q1  q3 
## * <chr> <dbl> <dbl> <dbl> <dbl> <dbl> 
## 1  am 1.000 0.000 0.000 0.0000 1.00 
## 2 carb 8.000 2.000 1.000 2.0000 4.00 
## 3 cyl 8.000 6.000 4.000 4.0000 8.00 
## ... 
+0

첫 번째 버전은 저에게 적합하지만 좋은 테이블은 아닙니다 (xtable에 전달할 수 없음). 나는 'tidyverse'설치에 문제가 있지만 작동한다고 믿습니다. – matandked

관련 문제