代码之家  ›  专栏  ›  技术社区  ›  Dee V

根据R中其余列的唯一性聚合一列

  •  1
  • Dee V  · 技术社区  · 6 年前

    我想根据其余列的唯一性聚合freq列。 我通常使用

     aggregate(freq~var1+var2+var3, df, sum)
    

    但在这种情况下,变量是未知的,因为用户将使用shiny中的下拉菜单选择变量

    DISEASE Gender  Age Race    Date       Freq
    Campy       F   32  ASIAN   1/6/2014    10
    Campy       M   52  WHITE   1/2/2014    15
    Campy       M   63  WHITE   1/3/2014    56
    Chlamydia   F   24  LATINO  1/8/2014    32
    Chlamydia   F   32  AA      1/3/2014    52
    

    所以在我的例子中,用户会选择前四列中的任何一列,例如,有人可能只选择疾病,然后我需要按疾病聚合频率,有人可能选择疾病和性别,同样

    2 回复  |  直到 6 年前
        1
  •  1
  •   colin    6 年前

    用户提供要聚合为向量的列名:

    user.cols <- c("DISEASE",'Age')
    

    您可以通过这些列在数据帧中创建唯一的向量

    df$unq <- apply( df[ , user.cols ] , 1 , paste , collapse = "-" )
    

    继续并按唯一列聚合:

    output <- aggregate(freq~unq, df, sum)
    
        2
  •  1
  •   Parfait    6 年前

    考虑使用 paste(..., collapse=...) :

    dynamic_agg <- function(vars) {
      f <- as.formula(paste0("Freq~", paste(vars, collapse="+")))
      aggregate(f, df, FUN=sum)
    }  
    
    dynamic_agg(c("Date"))
    #       Date Freq
    # 1 1/2/2014   15
    # 2 1/3/2014  108
    # 3 1/6/2014   10
    # 4 1/8/2014   32
    
    dynamic_agg(c("Gender", "Date"))
    #   Gender     Date Freq
    # 1      M 1/2/2014   15
    # 2      F 1/3/2014   52
    # 3      M 1/3/2014   56
    # 4      F 1/6/2014   10
    # 5      F 1/8/2014   32
    
    dynamic_agg(c("DISEASE", "Gender", "Date"))
    #     DISEASE Gender     Date Freq
    # 1     Campy      M 1/2/2014   15
    # 2 Chlamydia      F 1/3/2014   52
    # 3     Campy      M 1/3/2014   56
    # 4     Campy      F 1/6/2014   10
    # 5 Chlamydia      F 1/8/2014   32