2016-02-29 2 views
1

С этим dataframe:г Вычислить процент значений позитивов группы

table <- " 
    trt rep ss d1 d4 d5 d6 d7 
    1 1 1 0 0 0 0 0 
    1 1 2 0 0 0 0 0 
    1 1 3 0 0 1 2 2 
    1 2 1 0 0 1 3 6 
    1 2 2 0 1 1 2 4 
    1 2 3 0 0 0 1 1 
    1 3 1 0 0 0 0 0 
    1 3 2 0 0 0 0 0 
    1 3 3 0 1 1 1 1 
    2 1 1 0 0 0 0 0 
    2 1 2 0 0 0 1 1 
    2 1 3 0 0 0 1 1 
    2 2 1 0 0 0 0 0 
    2 2 2 0 0 0 0 0 
    2 2 3 0 0 0 0 1 
    2 3 1 0 0 0 0 0 
    2 3 2 0 0 0 1 3 
    2 3 3 . . . . . 
    " 
d <- read.table(text=table, header = TRUE, check.names = F, na.strings = ".") 

Я хотел бы получить dataframe с долей значений позитивов по ТРТУ на каждый день (d1, d4, ..., d7), такие как эта таблица:

# trt d1 d4  d5 d6 d7 
# 1 0.00 0.22 0.44 0.56 0.56 
# 2 0.00 0.00 0.00 0.38 0.50 

Может ли кто-нибудь помочь мне в этом? Спасибо заранее!

+2

'aggregate (d [, 4: 8]> 0 ~ d [, 1], FUN = mean)' –

+0

отличное решение! – Juanchi

ответ

3

Мы можем использовать dplyr

library(dplyr) 
d %>% 
    group_by(trt) %>% 
    summarise_each(funs(round(mean(.>0, na.rm=TRUE),2)), d1:d7) 
# trt d1 d4 d5 d6 d7 
# (int) (dbl) (dbl) (dbl) (dbl) (dbl) 
#1  1  0 0.22 0.44 0.56 0.56 
#2  2  0 0.00 0.00 0.38 0.50 
+1

ПРИМЕЧАНИЕ: вместо записи 'd1: d7)' его можно заменить на 'matches ("^d "))' – akrun

4

Использование data.table, что-то вроде этого:

library(data.table) 
d <- data.table(d) 
d[,lapply(.SD,function(x) sum(x>0,na.rm=T)/sum(!is.na(x))), 
    .SDcols=grep("^d",names(d),val=T), 
    by=trt] 

    trt d1  d4  d5  d6  d7 
1: 1 0 0.2222222 0.4444444 0.5555556 0.5555556 
2: 2 0 0.0000000 0.0000000 0.3750000 0.5000000 
6

Благодаря @ A.Webb, вот способ в базе R:

aggregate(d[,4:8]>0~d$trt, FUN = mean) 

# d$trt d1  d4  d5  d6  d7 
# 1  1 0 0.2222222 0.4444444 0.5555556 0.5555556 
# 2  2 0 0.0000000 0.0000000 0.3750000 0.5000000 

моя оригинальная идея:

rowsum(+(d[-(1:3)] > 0), d$trt, na.rm=TRUE)/
    rowsum(+!is.na(d[-(1:3)]), d$trt, na.rm=TRUE) 

+ есть, потому что rowsum работает только с числами, а не логические выражения.

+3

'aggregate (d [, 4: 8]> 0 ~ d [, 1], FUN = mean) ' –

+0

Спасибо @ A.Webb, добавили его. Я думаю, что это лучший способ. – Frank

+0

действительно лаконично! – Juanchi

Смежные вопросы