2016-06-24 3 views
0

의 두 가지 기능을 가진 데이터를 요약 : 나는 "Y"변수의 두 가지 작업으로 요약 테이블을 얻기 위해 노력하고있어이 예제 dataframe 고려 dplyr

d <- read.table(text=" 
    trt rep y 
    1 1 30 
    1 1 50 
    1 1 70 
    1 2 0 
    1 2 0 
    1 2 0 
    2 1 10 
    2 1 0 
    2 1 0 
    2 2 5 
    2 2 0 
    2 2 . 
    " 
    , header = TRUE, check.names = F, na.strings = ".") 

.

제 새로운 열은 모든 기라 TRT 의한 단순 평균값을 가져야한다 :

by_rep1 = d %>% 
    group_by(trt, rep) %>% 
    summarise(sev = mean(na.omit(y))) 

및 두번째마다 기라 TRT 의해 탐지 값의 비율. 난 한 번에 그것을 수행하는 방법 생각이 없기 때문에

by_rep2 = d %>% 
    group_by(trt, rep) %>% 
    summarise_each(funs(round(mean(.>0, na.rm=TRUE),2)), y) 

내가, 오랫동안이 일을 해요 :

inner_join(by_rep1, by_rep2, by = c("trt", "rep")) 

# trt rep mean_y  y 
# (int) (int)  (dbl) (dbl) 
#1  1  1 50.000000 1.00 
#2  1  2 0.000000 0.00 
#3  2  1 3.333333 0.33 
#4  2  2 2.500000 0.50 

사람이 하나의 단계에서 그렇게하는 방법을 알고하지 않습니다, 두 기능을 합치시겠습니까?

답변

4

당신은 하나의 summarize 문에 넣어 수 있습니다 사용

d %>% group_by(trt, rep) %>% summarise(mean_y = mean(y, na.rm = T), 
             y = round(mean(y > 0, na.rm = T), 2)) 
Source: local data frame [4 x 4] 
Groups: trt [?] 

    trt rep mean_y  y 
    (int) (int)  (dbl) (dbl) 
1  1  1 50.000000 1.00 
2  1  2 0.000000 0.00 
3  2  1 3.333333 0.33 
4  2  2 2.500000 0.50 
1

우리는 또한 data.table

library(data.table) 
setDT(d)[, .(mean_y = mean(y, na.rm = TRUE), y = round(mean(y > 0, 
       na.rm = TRUE), 2)) , .(trt, rep)] 
# trt rep mean_y y 
#1: 1 1 50.000000 1.00 
#2: 1 2 0.000000 0.00 
#3: 2 1 3.333333 0.33 
#4: 2 2 2.500000 0.50 

를 사용하거나이 작업을 수행 할 수 있습니다 만 base R

do.call(data.frame, aggregate(y~., d, FUN = function(x) 
    c(mean_y=mean(x, na.rm=TRUE), y=round(mean(x > 0, na.rm=TRUE),2)), na.action=NULL))