在给定数据帧的情况下,我可以对指定属性下的行进行分组,计数它们以了解组的大小,并使用id号唯一地分配它们。但是,我真正需要的是完成这个过程,以便在以下三个条件下限制组的大小:
因此,如果大小为4,则创建两组,均为2;而当大小为5时,则分裂为大小为3和2的两组。
我创建了下面的最小示例。
这是起始数据。通常,它不会被排序,可能会有更多的列:
structure(
list(property = c("A", "B", "B", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "E", "F", "F", "F", "F", "F", "F", "G", "G", "G", "G", "G", "G", "G")),
class = c("tbl_df", "tbl", "data.frame"),
row.names = c(NA, -28L),
.Names = "property"
)预期的产出将是:
structure(
list(property = c("A", "B", "B", "C", "C", "C", "D", "D", "D", "D", "E", "E", "E", "E", "E", "F", "F", "F", "F", "F", "F", "G", "G", "G", "G", "G", "G", "G"),
id = c(1, 2, 2, 3, 3, 3, 4, 4, 5, 5, 6, 6, 6, 7, 7, 8, 8, 8, 9, 9, 9, 10, 10, 10, 11, 11, 12, 12)),
class = c("tbl_df", "tbl", "data.frame"),
row.names = c(NA, -28L),
.Names = c("property", "id")
)团体的秩序并不重要。
发布于 2016-03-08 20:12:09
我首先创建一个函数,它将根据您的要求创建等号组。基本上,它总是会创建三个相等的数字组,然后切断那些结束时太多的数字。在特殊情况下,最后一个组的长度为1,最后一个但只有一个元素被替换为最后一个元素,以满足条件2:
create_grp_idx <- function(x) {
n <- length(x)
m <- n %/% 3 + 1
idx <- rep(1:m, each = 3)[1:n]
if (n %% 3 == 1 && n > 1) idx[n-1] <- idx[n]
return (idx)
}现在,我使用dplyr按property对数据进行分组,然后将create_grp_idx()应用于每个组,从而创建索引n。然后,我使用interaction()从property和新创建的索引n的每个组合中获得一个因素。由于您在示例中使用了数字,所以我将因子转换为数字,并最终删除索引n的列。
library(dplyr)
group_by(data, property) %>%
mutate(n = create_grp_idx(property)) %>%
ungroup %>%
mutate(id = as.numeric(interaction(property, n))) %>%
select(-n)
## Source: local data frame [28 x 2]
##
## property id
## (chr) (dbl)
## 1 A 1
## 2 B 2
## 3 B 2
## 4 C 3
## 5 C 3
## 6 C 3
## 7 D 4
## 8 D 4
## 9 D 11
## 10 D 11
## .. ... ...这并没有给出您给出的示例输出,但是既然您说组的顺序是无关的,那么我假设这就是您想要的结果。
https://stackoverflow.com/questions/35876306
复制相似问题