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



我正在寻找一种dplyr或tidyr解决方案,将数据集拆分为n个块。但是,我不想让任何单个ID进入多个块。也就是说,每个 ID 应仅出现在一个区块中。

例如,假设下面的"test"是一个 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 最终都在同一块中(无论哪个块无关紧要(。我查看了拆分功能,但找不到执行此操作的方法。

所需的输出将是这样的

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 个块。

您需要创建一个数据框,然后使用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

最新更新