在dplyr中用条件计算行平均值

时间:2017-04-10 15:44:42

标签: r dplyr

我的数据集如下所示:

> head(tempExp)
                                            points.id wc2.0_30s_tavg_01 wc2.0_30s_tavg_02
1 AmsterdamGreenhouses_Calamagrostis eigejos-AM_Nhigh               3.1               3.2
2      AmsterdamGreenhouses_Molinia caerulea-AM_Nhigh               3.1               3.2
3                            Bangor_Alnus-ECM/AM_Nlow               3.8               3.6
4                      Bangor_Betula_pendula-ECM_Nlow               3.8               3.6
5                               Bangor_Fagus-ECM_Nlow               3.8               3.6
6                      BioCON_nolegumes_mixed-AM_Nlow             -11.8              -7.9
  wc2.0_30s_tavg_03 wc2.0_30s_tavg_04 wc2.0_30s_tavg_05 wc2.0_30s_tavg_06 wc2.0_30s_tavg_07
1               5.9               8.3              12.6              15.1              17.1
2               5.9               8.3              12.6              15.1              17.1
3               5.4               7.3              10.3              12.7              14.7
4               5.4               7.3              10.3              12.7              14.7
5               5.4               7.3              10.3              12.7              14.7
6              -1.2               7.2              14.5              19.3              21.8

对于每一行(id),我需要计算整行的平均值,但只包括值>>的那些列。 5.

1 个答案:

答案 0 :(得分:1)

    require(dplyr)

    # simulate a similar data set 

    set.seed(1984)
    x <- rep('',100)
    for (i in 1:100)
    {x[i] <- paste(sample(c(LETTERS, 0:9), 5, replace = T), collapse = '')}

    df <- data.frame(ID = x, v1 = 3*rnorm(100), 
                     v2 = 5+3*rnorm(100), 
                     v3 = sample(1:20, 100, replace = T), 
                     v4 = rpois(100,6), 
                     v5 = rep(15,100))


    head(df)

    #     ID        v1        v2 v3 v4 v5
    #1 XPNL0  7.839162 -1.341105 12  5 15
    #2 5BQ3H -1.241025  7.651719  1  5 15
    #3 5AZZH  2.185374  2.186604  6  4 15
    #4 AKX7H  3.148868  2.513623 13  5 15
    #5 VAW42  2.757498  3.888333 16  5 15
    #6 F4UST -1.894727  4.587320  2  2 15


    df %>%  
      mutate(avg =apply(df[,-1], 1,
                        function(x) mean(x[x >5]))) -> df


    head(df)


#     ID        v1        v2 v3 v4 v5      avg
#1 XPNL0  7.839162 -1.341105 12  5 15 11.61305
#2 5BQ3H -1.241025  7.651719  1  5 15 11.32586
#3 5AZZH  2.185374  2.186604  6  4 15 10.50000
#4 AKX7H  3.148868  2.513623 13  5 15 14.00000
#5 VAW42  2.757498  3.888333 16  5 15 15.50000
#6 F4UST -1.894727  4.587320  2  2 15 15.00000