1
votes

comment créer une nouvelle colonne basée sur un intervalle spécifique

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?

r

1 commentaires

Pourquoi 80 est-il marqué comme 3, alors que la différence entre 65 et 80 est de 15


3 Réponses :


1
votes

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.


1 commentaires

Hé, merci beaucoup ça marche parfaitement mon ami!



1
votes

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))

data

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


0 commentaires

1
votes

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


0 commentaires