我正在寻找一种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_by
和mutate
添加列:
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