r按组计算正值的比例

时间:2016-02-29 21:03:18

标签: r

使用此数据框:

# 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

我希望每天(d1,d4,...,d7)获得一个数据帧,其中正数值的比例为trt,如下表所示:

DS

有人可以帮我吗? 提前谢谢!

3 个答案:

答案 0 :(得分: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仅适用于数字,而不适用于逻辑。

答案 1 :(得分: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

答案 2 :(得分: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