如何计算r中每个变量中某些观测值的比例?

时间:2017-09-27 01:15:29

标签: r dataframe

我有数据框架(population1),包括1100万行(观察)和11列(个体)。我的数据框的前几行看起来像这样:

> head(population1)
  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1  7  3 NA NA 10 NA NA NA NA  NA  NA
2 14 11  7 NA 12  3  4  5 14   3   6
3 13 11  7 NA 11  4 NA  4 13   3   4
4  3 NA  4  5  4 NA NA  6 17  NA   7
5  3 NA  5  5  4 NA NA  7 20  NA   8
6  6 NA  3  6 NA NA NA  5 16  NA  10

对于每个人,我想估计值大于5的观测比例。在R中有没有简单的解决方案?

2 个答案:

答案 0 :(得分:4)

以下解决方案使用sapply将函数应用于每列。该函数被定义为计算有多少观察值大于5,然后除以x的长度。

sapply(dt, function(x) sum(x > 5, na.rm = TRUE)/length(x))
       V1        V2        V3        V4        V5        V6        V7        V8        V9       V10 
0.6666667 0.3333333 0.3333333 0.1666667 0.5000000 0.0000000 0.0000000 0.3333333 0.8333333 0.0000000 
      V11 
0.6666667

数据

dt <- read.table(text = "  V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11
1  7  3 NA NA 10 NA NA NA NA  NA  NA
                 2 14 11  7 NA 12  3  4  5 14   3   6
                 3 13 11  7 NA 11  4 NA  4 13   3   4
                 4  3 NA  4  5  4 NA NA  6 17  NA   7
                 5  3 NA  5  5  4 NA NA  7 20  NA   8
                 6  6 NA  3  6 NA NA NA  5 16  NA  10",
                 header = TRUE)

答案 1 :(得分:1)

以下是使用tidyverse

的选项
library(dplyr)
pop1 %>%
     summarise_all(funs(sum(.>5, na.rm = TRUE)/n()))
#         V1        V2        V3        V4  V5 V6 V7        V8        V9 V10       V11
#1 0.6666667 0.3333333 0.3333333 0.1666667 0.5  0  0 0.3333333 0.8333333   0 0.6666667

如果我们需要vector,那么unlist

pop1 %>%
    summarise_all(funs(sum(.>5, na.rm = TRUE)/n())) %>%
    unlist(., use.names = FALSE)