Je voudrais créer une nouvelle colonne dans mon bloc de données en fonction des intervalles dans une autre colonne "dim"
par exemple:
mon ensemble de données est:
df1 id dim 1 25 2 34 3 60 4 65 5 80 6 82 7 90 8 95 9 110 10 120 I would like the follow data set below using the interval by 20 (my column begin with 25 for a new column x factors: 25:44 = 1 45=64= 2 and so on... df2 id dim x 1 25 1 2 34 1 3 60 2 4 65 3 5 80 3 6 82 3 7 90 4 8 95 4 9 110 5 10 120 5
quelqu'un pourrait m'aider avec ça?
3 Réponses :
Vous pouvez le faire avec floor et quelques maths:
df <- data.frame(id = 1:10, dim = c(25, 34, 60, 65, 80, 82, 90, 95, 110, 120)) df$x <- floor((df$dim - min(df$dim)) / 20) + 1 # id dim x #1 1 25 1 #2 2 34 1 #3 3 60 2 #4 4 65 3 #5 5 80 3 #6 6 82 3 #7 7 90 4 #8 8 95 4 #9 9 110 5 #10 10 120 5
Soustrayez la plus petite entrée de df $ dim pour démarrer votre première catégorie; divisez par 20 pour obtenir la taille de l'intervalle; prenez la parole pour arrondir vers le bas et ajoutez 1 pour tout décaler correctement.
Hé, merci beaucoup ça marche parfaitement mon ami!
Nous pouvons utiliser % /% sur la différence entre la valeur 'dim' et la première valeur de 'dim'
df <- structure(list(id = 1:10, dim = c(25, 34, 60, 65, 80, 82, 90, 95, 110, 120)), class = "data.frame", row.names = c(NA, -10L))
Ou une option avec findInterval
df %>% mutate(x = findInterval(dim, seq(20, length.out = n(), by = 20), all.inside = TRUE))
library(dplyr) df %>% mutate(x = (dim - first(dim)) %/% 20 + 1) # id dim x #1 1 25 1 #2 2 34 1 #3 3 60 2 #4 4 65 3 #5 5 80 3 #6 6 82 3 #7 7 90 4 #8 8 95 4 #9 9 110 5 #10 10 120 5
Voici une solution tidyverse utilisant cut.
library(tidyverse)
df %>%
mutate(x = cut(dim,
#Add 1 to the maximum value in dim to make sure it is included in the categorization.
breaks = seq(min(dim),max(dim)+1,20),
#Set this to T to include the lowest value
include.lowest = T,
#To set labels as a sequence of integers
labels = F))
# id dim x
#1 1 25 1
#2 2 34 1
#3 3 60 2
#4 4 65 2
#5 5 80 3
#6 6 82 3
#7 7 90 4
#8 8 95 4
#9 9 110 5
#10 10 120 5
Pourquoi 80 est-il marqué comme 3, alors que la différence entre 65 et 80 est de 15