【问题标题】:Creating a grouping indicator per row in R在 R 中为每行创建一个分组指示符
【发布时间】:2021-04-06 16:57:16
【问题描述】:

我有以下数据

x1 <- rnorm(20,0,1)
x2 <- rnorm(20,0,1)
group <- sample(50:55, size=20, replace=TRUE)
data <- data.frame(x1,x2,group)
head(data)

           x1          x2 group
1 -0.88001290  0.53866432    50
2  0.34228653 -0.54503078    52
3 -2.42308971  0.09542262    54
4  0.07310148 -1.03226594    50
5 -0.47786709  2.46726615    55
6  0.45224510 -1.46224926    55

我需要根据组变量创建一个分组指标。 (这样 group=50 的行将等于 1,group=51 等于 2 以此类推)

我尝试使用R 中的dplyr 包来执行此操作。但是我没有得到正确的答案,因为我没有正确定义指标变量。

data %>% arrange(group) %>% group_by(group) %>%  mutate(Indicator = n() )

谁能帮我更正我的代码?

谢谢

【问题讨论】:

    标签: r dplyr tidyr


    【解决方案1】:

    我们需要cur_group_id 而不是n()n() - 返回该组的行数)

    library(dplyr)
    data %>% 
      arrange(group) %>%
      group_by(group) %>%
      mutate(indicator = cur_group_id()) %>%
      ungroup
    

    -输出

    # A tibble: 20 x 4
    #        x1      x2 group indicator
    #     <dbl>   <dbl> <int>     <int>
    # 1 -1.24   -0.497     50         1
    # 2 -0.648   1.59      50         1
    # 3  0.598  -0.325     51         2
    # 4 -0.721   0.510     51         2
    # 5  0.259   1.62      51         2
    # 6 -0.288   0.872     52         3
    # 7  0.403   0.785     52         3
    # 8  1.84    1.65      52         3
    # 9  0.116  -0.0234    52         3
    #10 -1.31   -0.244     52         3
    #11 -0.615   0.994     53         4
    #12 -0.469   0.695     53         4
    #13 -0.324  -0.599     53         4
    #14 -0.394  -0.971     53         4
    #15  1.30    0.323     54         5
    #16  0.0242 -1.46      54         5
    #17 -0.342  -1.96      54         5
    #18  1.10   -0.569     54         5
    #19 -0.967  -0.863     54         5
    #20 -0.396  -0.441     55         6
    

    或者另一个选项是match

    data %>%
        mutate(indicator = match(group, sort(unique(group))))
    

    【讨论】:

      【解决方案2】:

      基础R 使用factor()

      levels = 50:55
      labels = 1:6
      data$indicator <- factor(data$group, levels, labels)
      

      levels = unique(data$group)
      labels = seq_len(length(levels))
      data$indicator <- factor(data$group, levels, labels)
      

      【讨论】:

        【解决方案3】:

        dplyr::dense_rank 即使没有分组也可能有帮助

        data %>% mutate(indicator = dense_rank(group) )
        

        baseR方式

        data$indicator <- as.numeric(as.factor(data$group))
        
        data
                     x1          x2 group indicator
        1  -1.453628399 -1.78776319    55         6
        2  -0.119413813 -0.07656982    52         3
        3   0.387951296 -0.26845052    55         6
        4   3.117977719  0.69280780    51         2
        5  -0.938126762 -0.16898209    50         1
        6  -1.596371818  0.35289797    52         3
        7  -2.291376398 -1.59385221    55         6
        8   0.161164263 -0.99387565    54         5
        9  -0.281744752 -0.26801191    53         4
        10  0.760719223 -0.28255900    50         1
        11 -0.204073022 -1.10262114    51         2
        12  0.653628314  0.77778039    54         5
        13  0.043736298 -0.37896178    55         6
        14  0.002800531  1.17034334    55         6
        15  0.451136658 -0.38459588    51         2
        16  0.151793862  0.60303631    55         6
        17  0.173976519 -0.41745808    53         4
        18  0.282827170 -0.16794851    52         3
        19  0.737444975 -0.45712603    51         2
        20  0.014182869  0.99013155    51         2
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-12-16
          • 2017-06-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-04-09
          • 2020-02-11
          相关资源
          最近更新 更多