Во многих случаях мы могли бы разбить число> = 20, но метод ниже делит каждое число пополам, то есть четные числа (m = 2n) делятся на n и n, нечетные числа (m = 2n + 1) делятся на(n + 1) и n.
> library(dplyr)
> df <- data.frame(alpha=c("a","a","a","a","f"),
+ number=c(20,21,2,34,42),
+ fr=c(0.8,2.0,0.8,0.8,0.5),
+ color=c("rot","rot","rot","rot","grün"))
Функция doSplit()
принимает в качестве аргумента фрейм данных df
и целое число threshold
.
> doSplit <- function(df, threshold){
+ # splits rows where number >= threshold until all rows have number < threshold
+
+ colNames <- colnames(df)
+ df <- df %>% mutate(orig_id=rownames(df))
+ dfBelow <- df %>% filter(number<threshold)
+ dfAbove1 <- df %>% filter(number>=threshold) %>% mutate(number=(number%/%2)+(number%%2))
+ dfAbove2 <- df %>% filter(number>=threshold) %>% mutate(number=number%/%2)
+ combData <- rbind(dfBelow, dfAbove1, dfAbove2)
+ combData <- combData %>% arrange(orig_id) %>% select(colNames)
+ return(combData)
+ }
Здесь мы определяемпорог 20. Цикл while
многократно вызывает функцию doSplit()
, пока существует строка с номером> = 20.
> myThreshold <- 20
> splitDf <- df
> while(splitDf %>% pull(number) %>% max() >= myThreshold){
+ splitDf <- doSplit(splitDf, myThreshold)
+ }
Вот разделенный фрейм данных:
> splitDf
alpha number fr color
1 a 10 0.8 rot
2 a 10 0.8 rot
3 a 11 2.0 rot
4 a 10 2.0 rot
5 a 2 0.8 rot
6 a 17 0.8 rot
7 a 17 0.8 rot
8 f 11 0.5 grün
9 f 10 0.5 grün
10 f 11 0.5 grün
11 f 10 0.5 grün