Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
计算大于X的多列上R的平均值_R_Dplyr - Fatal编程技术网

计算大于X的多列上R的平均值

计算大于X的多列上R的平均值,r,dplyr,R,Dplyr,我有以下数据,并希望计算每个cid的t1-t5平均值,按iid分组 我只想计算大于0的值的平均值 理想情况下,我不希望在执行平均值时命名所有字段,例如平均值(t1)、平均值(t2)。这是因为在我的真实案例中,我有200多个字段 样本数据: cid iid t1 t2 t3 t4 t5 4503 2 4 5 5 6 7 4503 2 7 5 3 2 8 841 2 9 2 1 5 7 2134 1

我有以下数据,并希望计算每个cid的t1-t5平均值,按iid分组

  • 我只想计算大于0的值的平均值
  • 理想情况下,我不希望在执行平均值时命名所有字段,例如平均值(t1)、平均值(t2)。这是因为在我的真实案例中,我有200多个字段 样本数据:

    cid   iid   t1  t2  t3  t4  t5
    4503    2   4   5   5   6   7
    4503    2   7   5   3   2   8
    841     2   9   2   1   5   7
    2134    1   6   9   8   2   1
    
    这是到目前为止我的代码。谁能帮我把它做完吗。提前谢谢

    library(dplyr)
    test <- read.csv("~/Documents/R-SCRIPTS/DATA/test.csv", sep=";")
    
    t <- test %>% 
      group_by(cid, iid) %>%
      select(t1:t5) %>%
      summarise(t1 = mean(t1, na.rm = TRUE), 
                t2 = mean(t2,na.rm = TRUE), 
                t3 = mean(t3,na.rm = TRUE), 
                t4 = mean(t4,na.rm = TRUE), 
                t5 = mean(t5,na.rm = TRUE) 
                ) 
    
    库(dplyr)
    测试%
    选择(t1:t5)%>%
    总结(t1=平均值(t1,na.rm=真值),
    t2=平均值(t2,na.rm=真值),
    t3=平均值(t3,na.rm=真值),
    t4=平均值(t4,na.rm=真值),
    t5=平均值(t5,na.rm=真值)
    ) 
    
    这就是你想要的吗?我不使用其他软件包,而是使用
    colMeans()
    。 以下是一个例子:

    数据看起来像(示例的简短副本)

    守则:

    id_list <- unique(mydata$iid) # get the id
    result <- matrix(nrow=0, ncol=4) # create a matrix to store result
    colnames(result) <- colnames(mydata) # name the columns of the matrix
    for (i in 1:length(id_list)){
       uid <- id_list[i]
       # for each id, calculate the column averages
       average <- unname(colMeans(mydata[mydata$iid==uid,2:4])) 
       # write to the result
       result <- rbind(result, c(uid, average))
    }
    result
    
    对于您的问题,您需要将
    colMeans(mydata[mydata$iid==uid,2:4])
    更改为
    colMeans(mydata[mydata$iid==uid,2:201])
    ,这是您想要平均值的列索引。并在
    矩阵中更改
    ncol
    (nrow=0,ncol=4)
    以对应所需的结果数据


    对于<0的值,您可以首先将负值转换为NA,
    mydata[,2:4][mydata[,2:4]如果我理解正确,您可以使用:

    test %>% 
      group_by(cid, iid) %>% 
      summarise_each(funs(mean(.[.>0], na.rm = TRUE)), t1:t5)
    #Source: local data frame [3 x 7]
    #Groups: cid [?]
    #
    #    cid   iid    t1    t2    t3    t4    t5
    #  (int) (int) (dbl) (dbl) (dbl) (dbl) (dbl)
    #1   841     2   9.0     2     1     5   7.0
    #2  2134     1   6.0     9     8     2   1.0
    #3  4503     2   5.5     5     4     4   7.5
    

    这是非常优雅的,可以完成工作。谢谢!如果我只想为每个cid的iid计数大于5的情况创建平均值,我将如何增强这一点?我想我会添加%>%筛选器(n()>5)是的,该筛选器应该在摘要之前
        > result
         iid       t1 t2 t3
    [1,]   2 6.666667  4  3
    [2,]   1 6.000000  9  8
    
    > mydata
      iid t1 t2 t3
    1   2  4  5  5
    2   2 -2  5  3
    3   2  9  2  1
    4   1  6  9 -1
    
    mydata[,2:4][mydata[,2:4]<0]<-NA
    id_list <- unique(mydata$iid)
    result <- matrix(nrow=0, ncol=4)
    colnames(result) <- colnames(mydata)
    for (i in 1:length(id_list)){
       uid <- id_list[i]
       average <- unname(colMeans(mydata[mydata$iid==uid,2:4], na.rm=TRUE))
       result <- rbind(result, c(uid, average))
    }
    result
    
    > result
         iid  t1 t2  t3
    [1,]   2 6.5  4   3
    [2,]   1 6.0  9 NaN
    
    test %>% 
      group_by(cid, iid) %>% 
      summarise_each(funs(mean(.[.>0], na.rm = TRUE)), t1:t5)
    #Source: local data frame [3 x 7]
    #Groups: cid [?]
    #
    #    cid   iid    t1    t2    t3    t4    t5
    #  (int) (int) (dbl) (dbl) (dbl) (dbl) (dbl)
    #1   841     2   9.0     2     1     5   7.0
    #2  2134     1   6.0     9     8     2   1.0
    #3  4503     2   5.5     5     4     4   7.5