【问题标题】:How to split a dataframe in groups with mutually excludent factors如何将数据框拆分为具有相互排斥因素的组
【发布时间】:2021-12-27 20:40:07
【问题描述】:

我正在苦苦思考如何将我的数据框分成 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

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

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

【问题讨论】:

  • 你说的同一辆车不属于同一类别是什么意思??
  • 另外,如果您可以在同一组中拥有不同的汽车,为什么不将上述所有汽车都放在组1中呢?你的解释仍然不完整。解释汽车 B、D 为何/如何在第 2 组中
  • @Onyambu,同一辆车,例如汽车A,它将出现在我真实数据框中的几行中。每次出现都必须有相同的对应类别,例如group = 1。同一组将有几辆不同的汽车,但同一辆车永远不能属于不同的组。
  • 那么没有唯一的解决方案。即取决于你想要多少组。如果你想要 1 组,所有的车都在同一个组中
  • @Onyambu,没错。我将在开始时尝试 4 个小组来尝试解决我的实际问题。

标签: r dataframe dplyr split


【解决方案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

【讨论】:

  • 我有 11321 不同的汽车,然后我需要一些方法,在同一组中包含更多类型的汽车。
  • 好吧,@DR15,只需将我的 4 替换为所需的组数!
【解决方案2】:
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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 1970-01-01
    • 2018-03-18
    • 2018-12-07
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 2018-03-25
    相关资源
    最近更新 更多