J'ai reçu un tableau de données à analyser. J'ai une colonne avec les heures de début et une colonne avec les heures de fin données en 3 ou 4 chiffres, exemple: 15h40 est 1540, 7h25 est 725.
Comment puis-je obtenir une nouvelle colonne dans mon tableau avec la différence de ces temps, exprimés en minutes? Il y a plus de 2000 entrées.
Merci pour toute aide.
structure(list(schedtime = c(1455L, 1640L, 1245L, 1715L, 1039L, 840L), deptime = c(1455L, 1640L, 1245L, 1709L, 1035L, 839L), distance = c(184L, 213L, 229L, 229L, 229L, 228L), flightnumber = c(5935L, 6155L, 7208L, 7215L, 7792L, 7800L), weather = c(0L, 0L, 0L, 0L, 0L, 0L), dayweek = c(4L, 4L, 4L, 4L, 4L, 4L), daymonth = c(1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 6L), class = "data.frame")
Ceci est un exemple de l'ensemble de données (je ne sais pas pourquoi il y a des L après chaque nombre, ceux-ci ne sont pas indiqués dans le tableau). Je veux, en minutes, deptime (finish) - schedtime (start).
Étant donné la nouvelle colonne, il y a 2 valeurs avec un schedtime avant minuit et un deptime après minuit, par exemple schedtime 2120 et deptime 0010 La réponse à cela est donnée en -1270, considérant que c'est un départ extrêmement précoce. Comment puis-je modifier ce paramètre pour qu'il soit calculé comme +170, un départ tardif?
4 Réponses :
dat <- data.frame(c(1540,1820,1330,545,100),c(1850,2150,2325,1330,101)) 60*(floor(dat[,2]/100) - floor(dat[,1]/100)) - dat[,1] %% 100 + dat[,2] %% 100 Taking the floor of the the hundreds gives the hours. Taking the difference and multiplying by 60 gives the minutes from the difference of the hours. Then you can subtract the original minutes and add the final minutes to get total minutes passed.
Y aurait-il un moyen de calculer en bas des colonnes et de créer une nouvelle colonne avec les réponses?
Vous pouvez utiliser la fonction Lubridate de bibliothèque pour trouver la différence en quelques minutes. J'espère que cela t'aides. lubridate fournit de très bonnes fonctionnalités pour les données liées au temps.
df <- structure(list(schedtime = c(1455L, 1640L, 1245L, 1715L, 1039L, 840L), deptime = c(1455L, 1640L, 1245L, 1709L, 1035L, 839L), distance = c(184L, 213L, 229L, 229L, 229L, 228L), flightnumber = c(5935L, 6155L, 7208L, 7215L, 7792L, 7800L), weather = c(0L, 0L, 0L, 0L, 0L, 0L), dayweek = c(4L, 4L, 4L, 4L, 4L, 4L), daymonth = c(1L, 1L, 1L, 1L, 1L, 1L)), row.names = c(NA, 6L), class = "data.frame")
library(lubridate) df$deptime_new <- minutes(df$deptime-df$schedtime)
Avec cela, j'obtiens l'erreur: l'objet de type 'fermeture' n'est pas sous-insérable
Cela donne des réponses incorrectes, par exemple 1730 - 1600 = 130 minutes, mais c'est en fait 90 minutes.
Moyen efficace pour un ensemble de données plus volumineux -
library(data.table) library(stringr) setDT(dt) dt[,schedtime:=str_pad(schedtime, 4, pad = "0")] dt[,deptime:=str_pad(deptime, 4, pad = "0")] dt[,time_diff:=difftime(as.ITime(strptime(x = schedtime, format = "%H%M")),as.ITime(strptime(x = deptime, format = "%H%M")),units = "mins")] > dt schedtime deptime distance flightnumber weather dayweek daymonth time_diff 1: 1455 1455 184 5935 0 4 1 0 mins 2: 1640 1640 213 6155 0 4 1 0 mins 3: 1245 1245 229 7208 0 4 1 0 mins 4: 1715 1709 229 7215 0 4 1 6 mins 5: 1039 1035 229 7792 0 4 1 4 mins 6: 1730 1600 228 7800 0 4 1 90 mins
MODIFIER- (Pour gérer des cas comme 1730 - 1600 = 130 minutes (en fait, c'est 90 minutes).
/ p>
data.table::setDT(dt)[,time_diff:=minutes(deptime-schedtime)] > dt schedtime deptime distance flightnumber weather dayweek daymonth time_diff 1: 1455 1455 184 5935 0 4 1 0S 2: 1640 1640 213 6155 0 4 1 0S 3: 1245 1245 229 7208 0 4 1 0S 4: 1715 1709 229 7215 0 4 1 -6M 0S 5: 1039 1035 229 7792 0 4 1 -4M 0S 6: 840 839 228 7800 0 4 1 -1M 0S
Erreur dans data.table :: setDT (dt): impossible de convertir «dt» en data.table par référence car la liaison est verrouillée. Il est très probable que «dt» réside dans un package (ou un environnement) qui est verrouillé pour éviter de modifier ses liaisons de variables. Essayez de copier l'objet dans votre environnement actuel, ex: var <- copy (var), puis utilisez à nouveau setDT. J'obtiens cette erreur, savez-vous comment y remédier? Merci de votre aide.
oh, vous pouvez supprimer dt et redémarrer la session R ou vous pouvez copier dt
vers un nouvel objet comme dt_copy <- copy (dt)
puis setDT (dt_copy) code>
Quel package dois-je télécharger pour la fonction de copie?
c'est une fonction du package data.table
avez-vous installé le package data.table
?
J'ai ce package mais j'obtiens une erreur: impossible de trouver la fonction "copie"
ce n'est pas possible, quelle version du package data.table
utilisez-vous? Aussi, avez-vous fait bibliothèque (data.table)
Je n'ai pas fait de bibliothèque (data.table), la fonction de copie fonctionne maintenant. Désolé, je suis très nouveau dans R. J'obtiens maintenant l'erreur: Erreur dans data.table :: setDT (dt_copy): L'argument 'x' à 'setDT' doit être une 'liste', 'data.frame' ou 'data .table'
avez-vous créé dt_copy
à partir de dt
?
J'ai fait. Cela donne des réponses incorrectes, par exemple 1730 - 1600 = 130 minutes, mais c'est en fait 90 minutes.
Ajout d'une nouvelle réponse, veuillez vérifier.
Cela fonctionne très bien, merci. Comment géreriez-vous une valeur de 2120 à 0010? Actuellement, le code considère qu'il s'agit d'un retard négatif (précoce) -1270, mais je voudrais qu'il soit 170. Je comprends que c'est un problème de ne pas avoir les dates. Il y a peu de ces problèmes, y a-t-il un moyen de les changer chacun manuellement?
J'ai la même requête, existe-t-il un moyen de calculer le décalage horaire des heures dans une colonne et d'afficher les réponses dans une nouvelle colonne en minutes
Veuillez utiliser la section des commentaires car ce n'est pas une réponse.
Veuillez mettre à jour votre question avec des exemples de données en utilisant
dput
Quelle est l'attente de production?