首页 文章

用于拆分数据集的dplyr解决方案,但将ID保留在相同的拆分中

提问于
浏览
0

我正在寻找一个dplyr或tidyr解决方案来将数据集拆分为n个块 . 但是,我不希望任何单个ID进入多个块 . 也就是说,每个ID应该只出现在一个块中 .

例如,想象下面的“测试”是一个ID变量,数据集有许多其他列 .

test<-data.frame(id= c(1,2,3,4,4,4,4,4,6,7,8,9,9,9,9,10),
             val = 1:16)
out <- test %>% select(id) %>% ntile(n = 3)
out
[1] 1 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3

ID = 4将以块1和2结束 . 我想知道如何对此进行编码,以便所有ID = 4最终都在同一个块中(无关紧要) . 我查看了split函数,但找不到这样做的方法 .

期望的输出就像是

test[which(out==1),]

回国

id val
1  1   1
2  2   2
3  3   3
4  4   4
5  4   5
6  4   6
7  4   7
8  4   8

然后如果我想查看第二个块,我会调用类似test [which(out == 2),]等等,直到out == n . 我只想一次处理一个块 . 我不需要同时创建所有n个块 .

1 回答

  • 2

    您需要创建一个数据框,然后使用 group_bymutate 添加列:

    test<-data_frame(id = c(1,2,3,4,4,4,4,4,6,7,8,9,9,9,9,10),
                     value = 1:16)
    out <- test %>%
      mutate(new_column = ntile(id,3))
    out
    
    # A tibble: 16 x 3
          id value new_column
       <dbl> <int>      <int>
     1     1     1          1
     2     2     2          1
     3     3     3          1
     4     4     4          1
     5     4     5          1
     6     4     6          1
     7     4     7          2
     8     4     8          2
     9     6     9          2
    10     7    10          2
    11     8    11          2
    12     9    12          3
    13     9    13          3
    14     9    14          3
    15     9    15          3
    16    10    16          3
    

    或者给出Frank的评论你可以在id的不同/唯一值上运行 ntile 函数 - 然后将原始表加入id:

    test<-data_frame(id = c(1,2,3,4,4,4,4,4,6,7,8,9,9,9,9,10),
                     value = 1:16)
    out <- test %>%
      distinct(id) %>%
      mutate(new_column = ntile(id,3)) %>%
      right_join(test, by = "id")
    out
    # A tibble: 16 x 3
          id new_column value
       <dbl>      <int> <int>
     1     1          1     1
     2     2          1     2
     3     3          1     3
     4     4          2     4
     5     4          2     5
     6     4          2     6
     7     4          2     7
     8     4          2     8
     9     6          2     9
    10     7          2    10
    11     8          3    11
    12     9          3    12
    13     9          3    13
    14     9          3    14
    15     9          3    15
    16    10          3    16
    

相关问题