【问题标题】:count row number first and then insert new row by condition [duplicate]首先计算行号,然后按条件插入新行[重复]
【发布时间】:2018-05-30 04:24:38
【问题描述】:

我需要在 group_by 函数之后先计算行数,如果行数

我的 df 有三个变量(v1,v2,v3):v1 = group namev2 = row number(即 1、2、3、4、5、6)。在新行中,我想重复v1 值,v2 继续计算行号,v3 = NA

样本df

v1    v2    v3
1     1     79
1     2     32
1     3     53
1     4     33
1     5     76
1     6     11
2     1     32
2     2     42
2     3     44
2     4     12
3     1     22
3     2     12
3     3     12
3     4     67
3     5     32

预期输出

v1    v2    v3
1     1     79
1     2     32
1     3     53
1     4     33
1     5     76
1     6     11
2     1     32
2     2     42
2     3     44
2     4     12
2     5     NA #insert
2     6     NA #insert
3     1     22
3     2     12
3     3     12
3     4     67
3     5     32
3     6     NA #insert

我尝试先通过dplyr 计算行号,但我不知道是否可以或如何使用 pip 添加此if else 条件。还是有其他更简单的功能?

我的代码

 df %>%
   group_by(v1) %>%
   dplyr::summarise(N=n()) %>%
   if (N < 6) {
   # sth like that?
  }

谢谢!

【问题讨论】:

    标签: r if-statement dataframe insert


    【解决方案1】:

    我们可以使用complete

    library(tidyverse)
    complete(df1, v1, v2)
    # A tibble: 18 x 3
    #      v1    v2    v3
    #   <int> <int> <int>
    # 1     1     1    79
    # 2     1     2    32
    # 3     1     3    53
    # 4     1     4    33
    # 5     1     5    76
    # 6     1     6    11
    # 7     2     1    32
    # 8     2     2    42
    # 9     2     3    44
    #10     2     4    12
    #11     2     5    NA
    #12     2     6    NA
    #13     3     1    22
    #14     3     2    12
    #15     3     3    12
    #16     3     4    67
    #17     3     5    32
    #18     3     6    NA
    

    【讨论】:

      【解决方案2】:

      这是一种使用merge 的方法。

      df <- read.table(text = 
                      "v1    v2    v3
                       1     1     79
                       1     2     32
                       1     3     53
                       1     4     33
                       1     5     76
                       1     6     11
                       2     1     32
                       2     2     42
                       2     3     44
                       2     4     12
                       3     1     22
                       3     2     12
                       3     3     12
                       3     4     67
                       3     5     32", header = T)
      toMerge <- data.frame(v1 = rep(1:3, each = 6), v2 = rep(1:6, times = 3))
      m <- merge(toMerge, df, by = c("v1", "v2"), all.x = T)
      m
      
         v1 v2 v3
      1   1  1 79
      2   1  2 32
      3   1  3 53
      4   1  4 33
      5   1  5 76
      6   1  6 11
      7   2  1 32
      8   2  2 42
      9   2  3 44
      10  2  4 12
      11  2  5 NA
      12  2  6 NA
      13  3  1 22
      14  3  2 12
      15  3  3 12
      16  3  4 67
      17  3  5 32
      18  3  6 NA
      

      【讨论】:

        猜你喜欢
        • 2019-06-26
        • 2018-05-30
        • 2017-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-02
        • 1970-01-01
        相关资源
        最近更新 更多