代码之家  ›  专栏  ›  技术社区  ›  R overflow

基于其他列计算列中的比率

r
  •  0
  • R overflow  · 技术社区  · 7 年前

    我正面临一个思考和挑战;编程问题。看下面我的问题,我不知道什么是正确的方法(与DPLYR的group_by一起玩,但没有结果)。非常感谢你在这里帮助我!

    Numbers   Area      Cluster  
    1         A          1            
    0.8       A          1
    0.78      A          1
    0.7       B          1
    0.4       A          2
    0         C          1 
    

    我想计算两个新列:

    1. 显示特定簇中出现的面积百分比(列\u示例\u 1)
    2. 对于每个集群,列编号的新索引(范围为1-0)(列\示例\ 2)。新的比率应基于列数#注意:在示例中,这只是一个示例,也可以采用不同的方式,但我希望确保列数处于前导位置)

    结果应该是这样的:

    Numbers   Area      Cluster  Example_1                             Example_2 
    1         A          1          60%  #5x cluster 1, and 3x Area A)   1
    0.8       A          1          60%                                  0.8  
    0.78      A          1          60%                                  0.78
    0.7       B          1          20%                                  0.7 
    0.4       A          2         100%                                  1
    0         C          1          20%                                  0
    
    2 回复  |  直到 7 年前
        1
  •  2
  •   erocoar    7 年前

    由于要保留所有行,因此可以按如下方式计算相对频率:

    library(tidyverse)
    df <- data.frame(numbers = c(1, .8, .78, .7, .4, 0),
                     area = c("A", "A", "A", "B", "A", "C"),
                     cluster = c(1, 1, 1, 1, 2, 1))
    
    df %>% 
      group_by(cluster) %>%
      mutate(example_1 = n()) %>%
      group_by(area, cluster) %>%
      mutate(example_1 = n() / example_1)
    
    # A tibble: 6 x 4
    # Groups:   area, cluster [4]
      numbers area  cluster example_1
        <dbl> <fct>   <dbl>     <dbl>
    1    1    A           1       0.6
    2    0.8  A           1       0.6
    3    0.78 A           1       0.6
    4    0.7  B           1       0.2
    5    0.4  A           2       1  
    6    0    C           1       0.2
    
        2
  •  1
  •   JdeMello    7 年前

    data.table :

    library(magrittr)
    library(data.table)
    
    df <- data.table(Numbers = c(1, .8, .78, .7, .4, 0), 
               Area = c(rep("A", 3), "B", "A", "C"), 
               Cluster = c(rep(1, 4), 2, 1))
    
    df[, N := .N, by = c("Cluster")] %>% 
      .[, Example_1 := .N/N, by = c("Cluster", "Area")] %>% 
      .[, `:=`(N = NULL, Example_2 = Numbers)]
    

    输出:

    > df
       Numbers Area Cluster Example_1 Example_2
    1:    1.00    A       1       0.6      1.00
    2:    0.80    A       1       0.6      0.80
    3:    0.78    A       1       0.6      0.78
    4:    0.70    B       1       0.2      0.70
    5:    0.40    A       2       1.0      0.40
    6:    0.00    C       1       0.2      0.00