使用dplyr()来计算,有问题

时间:2017-02-27 19:01:18

标签: r dplyr

这可能是我的脑屁但我想要一些帮助。

我有一个数据框:

dftest <- data.frame(
    "id" = c(rep("A",5),rep("B",5),rep("C",5)),
    "time" = c(0,1,2,3,4,0,1,2,3,4,0,1,2,3,4),
    "val" = c(1,2,2,2,2,1,2,2,2,2,2,1,1,1,1))

我正在尝试使用数据框每次查找val列等于2的次数除以当时的条目总数。

因此对于上述数据帧,对于时间= 0,对于id =“C”,val = 2,因此结果将是1/3,而对于时间1,对于id =“A”和id,val = 2 =“B”,结果是2/3。

如何在dplyr中执行此操作?

3 个答案:

答案 0 :(得分:1)

您可以在布尔值(强制为0/1)上使用mean()函数找到比例。例如

dftest %>% group_by(time) %>% 
    summarize(proptwo = mean(val==2))
#   A tibble: 5 × 2
#    time   proptwo
#   <dbl>     <dbl>
# 1     0 0.3333333
# 2     1 0.6666667
# 3     2 0.6666667
# 4     3 0.6666667
# 5     4 0.6666667

答案 1 :(得分:1)

我可能会按照您的意愿选择不同的路线,但是:

plyr::ldply(dftest %>% split(., .[['time']]), function(i){
    nrow(i %>% dplyr::filter(val == 2)) / nrow(i)
}) %>% select(time = 1, freq = 2)


  time      freq
1    0 0.3333333
2    1 0.6666667
3    2 0.6666667
4    3 0.6666667
5    4 0.6666667

答案 2 :(得分:0)

以下是使用aggregate

base R的选项
aggregate(cbind(proptwo = val==2)~time, dftest, mean)
#   time   proptwo
#1    0 0.3333333
#2    1 0.6666667
#3    2 0.6666667
#4    3 0.6666667
#5    4 0.6666667