使用此数据框:
# 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
有人可以帮我吗? 提前谢谢!
答案 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