首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何对数据进行分组,并在R中限制组大小

如何对数据进行分组,并在R中限制组大小
EN

Stack Overflow用户
提问于 2016-03-08 19:27:32
回答 1查看 1.1K关注 0票数 1

在给定数据帧的情况下,我可以对指定属性下的行进行分组,计数它们以了解组的大小,并使用id号唯一地分配它们。但是,我真正需要的是完成这个过程,以便在以下三个条件下限制组的大小:

  1. 如果大小模3 = 0,则分裂成大小为3的小组,
  2. 如果大小模3= 1,则分裂为大小3的较小组和大小为2的两组。
  3. 如果大小模3= 2,则分裂为3和2大小的较小组。

因此,如果大小为4,则创建两组,均为2;而当大小为5时,则分裂为大小为3和2的两组。

我创建了下面的最小示例。

这是起始数据。通常,它不会被排序,可能会有更多的列:

代码语言:javascript
复制
   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"
     )

预期的产出将是:

代码语言:javascript
复制
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")
  )

团体的秩序并不重要。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-08 20:12:09

我首先创建一个函数,它将根据您的要求创建等号组。基本上,它总是会创建三个相等的数字组,然后切断那些结束时太多的数字。在特殊情况下,最后一个组的长度为1,最后一个但只有一个元素被替换为最后一个元素,以满足条件2:

代码语言:javascript
复制
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)
}

现在,我使用dplyrproperty对数据进行分组,然后将create_grp_idx()应用于每个组,从而创建索引n。然后,我使用interaction()property和新创建的索引n的每个组合中获得一个因素。由于您在示例中使用了数字,所以我将因子转换为数字,并最终删除索引n的列。

代码语言:javascript
复制
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
## ..      ...   ...

这并没有给出您给出的示例输出,但是既然您说组的顺序是无关的,那么我假设这就是您想要的结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35876306

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档