如何将数据框拆分为具有互斥因素的组
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
我正在苦苦思索如何将我的数据框分成 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