Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.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
R 如何计算data.table中几个类别的平均值?_R - Fatal编程技术网

R 如何计算data.table中几个类别的平均值?

R 如何计算data.table中几个类别的平均值?,r,R,给出此数据示例: library(data.table) dat=structure(list(bin = structure(c(1L, 2L, 4L, 3L, 5L, 6L, 1L, 2L, 4L, 3L, 5L, 6L, 1L, 2L, 4L, 3L, 5L, 6L, 1L, 2L), .Label = c("a","b", "c", "c", "d", "e&qu

给出此数据示例:

  library(data.table)
   dat=structure(list(bin = structure(c(1L, 2L, 4L, 3L, 5L, 6L, 1L, 
  2L, 4L, 3L, 5L, 6L, 1L, 2L, 4L, 3L, 5L, 6L, 1L, 2L), .Label = c("a","b", "c", "c", "d", "e"), class = 
 "factor"), 
value = c(3, 7, 0, 
1, 1, 4, 8,4, 8, 7,2, 2, 4,6, 7, 17, 1, 2, 4, 7), nvar = c("Ecor", 
"Ecor", "Ecor", "Ecor", "Ecor", 
"Ecor", "AM", "AM", "AM", "AM", "AM", 
"AM", "SS", "SS", "SS", "SS", "SS", "SS", 
"ACC", "ACC")), row.names = c(NA, -20L), class = c("data.table", 
"data.frame"))
我想计算(使用值)的平均值

  • Ecor和ACC(=cat1)
  • nvar中除Ecor、ACC和SS(=cat2)之外的所有变量
  • 保持SS不变
  • 输出可以如下所示:

              bin value nvar
         1:   a     3 cat1
         2:   b     7 cat1
         3:   c     0 cat1
         4:   c     1 cat1
         5:   d     1 cat1
         6:   e     4 cat1
         7:   a     8   cat2
         8:   b     4   cat2
         9:   c     8   cat2
        10:   c     7   cat2
        11:   d     2   cat2
        12:   e     2   cat2
        13:   a     4   SS
        14:   b     6   SS
        15:   c     7   SS
        16:   c    17   SS
        17:   d     1   SS
    

    您可以使用
    fifelse
    根据条件创建一个新列,并计算每组的平均值

    library(data.table)
    
    dat[, nvar := fifelse(nvar %in% c('Ecor', 'ACC'), 'cat1', 
                        fifelse(nvar == 'SS', 'SS', 'cat2'))]
    
    dat[, .(value = mean(value)), .(bin, nvar)]
    

    我们可以使用
    data.table中的
    fcase
    ,避免嵌套比较

    library(data.table)
    dat[, .(value = mean(value)), .(bin, 
           nvar = fcase(nvar %chin% c("Ecor", "ACC"), "cat1",
                        nvar == "SS", "SS", default = "cat2"))]
    
    -输出

    #      bin nvar value
    # 1:   a cat1   3.5
    # 2:   b cat1   7.0
    # 3:   c cat1   0.0
    # 4:   c cat1   1.0
    # 5:   d cat1   1.0
    # 6:   e cat1   4.0
    # 7:   a cat2   8.0
    # 8:   b cat2   4.0
    # 9:   c cat2   8.0
    #10:   c cat2   7.0
    #11:   d cat2   2.0
    #12:   e cat2   2.0
    #13:   a   SS   4.0
    #14:   b   SS   6.0
    #15:   c   SS   7.0
    #16:   c   SS  17.0
    #17:   d   SS   1.0
    #18:   e   SS   2.0
    

    多谢。在我的真实数据中,我需要保持SS和MM的原样。将是fifelse(nvar==c('SS','MM'),('SS',MM','cat2'))]你可以使用
    dat[,nvar:=fifelse(nvar%in%c('Ecor','ACC'),'cat1',fifelse(nvar%in%c('SS','MM'),nvar','cat2'))]