【问题标题】:Calculating the mean value when the total is different per condition当每个条件的总数不同时计算平均值
【发布时间】:2021-08-12 13:01:13
【问题描述】:

我正在与 R 合作。

在这里我分享我的数据样本...

structure(list(column_a = c("1_1", "1_1", "1_2", "1_2", "1_2", 
"2_1", "2_2", "2_2", "3_1", "3_2"), column_b = c("kitchen", "tree", 
"hate", "kind", "table", "dog", "human", "car", "moon", "rage"
)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))

   column_a column_b
1       1_1  kitchen
2       1_1     tree
3       1_2     hate
4       1_2     kind
5       1_2    table
6       2_1      dog
7       2_2    human
8       2_2      car
9       3_1     moon
10      3_2     rage

我需要计算条件(1_1、1_2 等)产生的总单词的平均值。我遇到的唯一问题是以“_1”结尾的条件总数为 50,而以“_2”结尾的条件总数为 100。

因此,由于条件“1_1”产生了两个单词(在示例中),我应该通过 50 的潜水来计算平均值。这是 2/50 = 0.04。但是,在计算“1_2”条件的平均值时,我需要除以 100。这是 3/100 = 0.03。

考虑到某些条件需要按 50 计算,而其他条件需要按 100 计算,我需要创建一个列,该列具有条件产生的总单词的平均值。我怎样才能做到这一点并且仍然有结果在同一列?

【问题讨论】:

    标签: r mean


    【解决方案1】:

    只需按组计数并计算平均值:

    df %>% 
      group_by(column_a) %>% 
      add_count() %>% 
      summarise(mean_group = mean(n))
    

    输出:

      column_a mean_group
      <chr>         <dbl>
    1 1_1               2
    2 1_2               3
    3 2_1               1
    4 2_2               2
    5 3_1               1
    6 3_2               1
    

    【讨论】:

      【解决方案2】:

      您可以使用case_when 来包含一个新列 (divide),它可以是 50 或 100,并除以组中的行数 (column_a)。

      library(dplyr)
      
      df %>%
        mutate(divide = case_when(endsWith(column_a, '_1') ~ 50, 
                                  endsWith(column_a, '_2') ~ 100)) %>%
        group_by(column_a) %>%
        mutate(value = n()/divide) %>%
        ungroup
      
      #   column_a column_b divide value
      #   <chr>    <chr>     <dbl> <dbl>
      # 1 1_1      kitchen      50  0.04
      # 2 1_1      tree         50  0.04
      # 3 1_2      hate        100  0.03
      # 4 1_2      kind        100  0.03
      # 5 1_2      table       100  0.03
      # 6 2_1      dog          50  0.02
      # 7 2_2      human       100  0.02
      # 8 2_2      car         100  0.02
      # 9 3_1      moon         50  0.02
      #10 3_2      rage        100  0.01
      

      也与add_count类似-

      library(dplyr)
      
      df %>%
        mutate(divide = case_when(endsWith(column_a, '_1') ~ 50, 
                                  endsWith(column_a, '_2') ~ 100)) %>%
        add_count(column_a) %>%
        mutate(value = n/divide) 
        ungroup
      

      【讨论】:

        【解决方案3】:

        使用data.table

        library(data.table)
        setDT(df)[, n := .N, column_a][, .(mean_group = mean(n)), by = column_a]
        

        【讨论】:

          【解决方案4】:

          使用ave + endsWith 的基本 R 选项

          transform(
            df,
            value = ave(column_a,
              column_a,
              FUN = function(x) length(x) / ifelse(endsWith(x, "_1"), 50, 100)
            )
          )
          

          给予

             column_a column_b value
          1       1_1  kitchen  0.04
          2       1_1     tree  0.04
          3       1_2     hate  0.03
          4       1_2     kind  0.03
          5       1_2    table  0.03
          6       2_1      dog  0.02
          7       2_2    human  0.02
          8       2_2      car  0.02
          9       3_1     moon  0.02
          10      3_2     rage  0.01
          

          【讨论】:

            猜你喜欢
            • 2016-11-14
            • 2022-12-02
            • 2018-09-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-05-05
            相关资源
            最近更新 更多