如何将数据框拆分为具有互斥因素的组

How to split a dataframe in groups with mutually excludent factors

我正在苦苦思索如何将我的数据框分成 2 个或更多部分。我有很多列和行,但想象一个玩具示例:

test = data.frame(car = c("A", "A", "B", "C", "D", "E", "B", "C", "D"), value = c(5,4,3,5, 6, 6, 7 ,8 ,10))

#result
#  car value  group
#1   A     5  1
#2   A     4  1
#3   B     3  2
#4   C     5  1
#5   D     6  2
#6   E     6  2
#7   B     7  2
#8   C     8  1
#9   D    10  2

我需要的唯一限制是: 同一辆车不能属于同一类别,即同一辆车,例如 car A,它会出现在我的真实数据帧的几行中。每次出现,都必须有相同的对应类别,例如group = 1。同一个组会有好几辆不同的车,但同一个车永远不能在不同的组。

有什么提示吗?我尝试了 test %>% mutate(group = ntile(car, 4)) 但没有成功。

gr <- function(df, groups){
  g <- as.integer(factor(df[[1]])) %% groups
  df$groups <- as.integer(factor(g))
  df
}

gr(test, 1)
  car value groups
1   A     5      1
2   A     4      1
3   B     3      1
4   C     5      1
5   D     6      1

gr(test, 2)
  car value groups
1   A     5      2
2   A     4      2
3   B     3      1
4   C     5      2
5   D     6      1

gr(test, 3)
  car value groups
1   A     5      2
2   A     4      2
3   B     3      3
4   C     5      1
5   D     6      2
gr(test, 4)
  car value groups
1   A     5      2
2   A     4      2
3   B     3      3
4   C     5      4
5   D     6      1

使用dplyr方法:

library(dplyr)

test = data.frame(car = c("A", "A", "B", "C", "D", "E", "B", "C", "D"), value = c(5,4,3,5, 6, 6, 7 ,8 ,10))

test %>% 
  mutate(group = 1 + match(car,car) %% 4) 

#>   car value group
#> 1   A     5     2
#> 2   A     4     2
#> 3   B     3     4
#> 4   C     5     1
#> 5   D     6     2
#> 6   E     6     3
#> 7   B     7     4
#> 8   C     8     1
#> 9   D    10     2