Рассчитать прошедшее время, используя данные времени данных в R - PullRequest
1 голос
/ 01 февраля 2020

Я работаю над набором клинических данных, в котором образцы были взяты у субъектов после приема дозы лекарства. Столбец «дата-время» для образцов и доз был предоставлен в следующем формате непосредственно из базы клинических данных.

Предполагаемый результат - создать столбец для прошедшего времени после дозы (то есть: Sample.Time - Dose.Time). Вывод может быть в минутах или часах. NB: нам нужно использовать как дату, так и время, потому что выборка может происходить не так, как дозировка.

Sample.Time         Dose.Time
2019-06-07T08:23    2019-06-07T07:53
2019-06-07T08:53    2019-06-07T07:53
2019-06-07T09:23    2019-06-07T07:53
2019-06-07T09:53    2019-06-07T07:53
2019-06-07T10:23    2019-06-07T07:53
2019-06-07T10:53    2019-06-07T07:53
2019-06-07T11:53    2019-06-07T07:53
2019-06-07T13:53    2019-06-07T07:53
2019-06-07T15:53    2019-06-07T07:53
2019-06-07T17:53    2019-06-07T07:53

Предполагаемый вывод для создания "Time.After.Dose"

Sample.Time          Dose.Time         Time.After.Dose
2019-06-07T08:23    2019-06-07T07:53    0.5
2019-06-07T08:53    2019-06-07T07:53    1
2019-06-07T09:23    2019-06-07T07:53    1.5
2019-06-07T09:53    2019-06-07T07:53    2
2019-06-07T10:23    2019-06-07T07:53    2.5
2019-06-07T10:53    2019-06-07T07:53    3
2019-06-07T11:53    2019-06-07T07:53    4
2019-06-07T13:53    2019-06-07T07:53    6
2019-06-07T15:53    2019-06-07T07:53    8
2019-06-07T17:53    2019-06-07T07:53    10
2019-06-07T19:50    2019-06-07T07:53    11.95
2019-06-08T07:43    2019-06-07T07:53    23.83333333
2019-06-09T07:43    2019-06-07T07:53    47.83333333
2019-06-12T07:43    2019-06-07T07:53    119.8333333

Ответы [ 3 ]

2 голосов
/ 01 февраля 2020

Я почти уверен, что вы могли бы найти похожие работающие примеры, но R datetimes - это общий источник путаницы ios, поэтому, я думаю, я сэкономлю вам время:

dat <- read.table(text="Sample.Time         Dose.Time
2019-06-07T08:23    2019-06-07T07:53
2019-06-07T08:53    2019-06-07T07:53
2019-06-07T09:23    2019-06-07T07:53
2019-06-07T09:53    2019-06-07T07:53
2019-06-07T10:23    2019-06-07T07:53
2019-06-07T10:53    2019-06-07T07:53
2019-06-07T11:53    2019-06-07T07:53
2019-06-07T13:53    2019-06-07T07:53
2019-06-07T15:53    2019-06-07T07:53
2019-06-07T17:53    2019-06-07T07:53", head=TRUE)

 dat$Time.After.Dose <- difftime( as.POSIXct( dat[[1]], format="%Y-%m-%dT%H:%M"), 
                                  as.POSIXct( dat[[2]], format="%Y-%m-%dT%H:%M"), 
                                  units="min")

> dat
        Sample.Time        Dose.Time Time.After.Dose
1  2019-06-07T08:23 2019-06-07T07:53         30 mins
2  2019-06-07T08:53 2019-06-07T07:53         60 mins
3  2019-06-07T09:23 2019-06-07T07:53         90 mins
4  2019-06-07T09:53 2019-06-07T07:53        120 mins
5  2019-06-07T10:23 2019-06-07T07:53        150 mins
6  2019-06-07T10:53 2019-06-07T07:53        180 mins
7  2019-06-07T11:53 2019-06-07T07:53        240 mins
8  2019-06-07T13:53 2019-06-07T07:53        360 mins
9  2019-06-07T15:53 2019-06-07T07:53        480 mins
10 2019-06-07T17:53 2019-06-07T07:53        600 mins

Ключевые моменты в том, что есть функция разницы во времени и что аргументы этой функции должны быть класса POSIXct, а as.POSIXct, в свою очередь, должен иметь правильную строку формата для текстовых значений, которые вы представляете. Технически эти столбцы являются значениями факторов, поэтому я, вероятно, должен был добавить stringsAsFactors = FALSE на этапе ввода.

2 голосов
/ 01 февраля 2020

Мой ответ похож на другие ответы. Я хочу показать, что после вычисления разницы во времени мы можем использовать as.double и установить аргумент units в hours, чтобы получить желаемый результат. В этом примере также показано, как выполнить эту операцию с использованием пакета data.table.

# Load packages
library(data.table)
library(lubridate)

# Create example data frame
dat <- fread("Sample.Time         Dose.Time
2019-06-07T08:23    2019-06-07T07:53
2019-06-07T08:53    2019-06-07T07:53
2019-06-07T09:23    2019-06-07T07:53
2019-06-07T09:53    2019-06-07T07:53
2019-06-07T10:23    2019-06-07T07:53
2019-06-07T10:53    2019-06-07T07:53
2019-06-07T11:53    2019-06-07T07:53
2019-06-07T13:53    2019-06-07T07:53
2019-06-07T15:53    2019-06-07T07:53
2019-06-07T17:53    2019-06-07T07:53")

# Convert to POSIXct class
dat <- dat[, lapply(.SD, function(x) ymd_hm(x))]

# See the class of each column
str(dat)
# Classes ‘data.table’ and 'data.frame':    10 obs. of  3 variables:
#   $ Sample.Time    : POSIXct, format: "2019-06-07 08:23:00" "2019-06-07 08:53:00" "2019-06-07 09:23:00" "2019-06-07 09:53:00" ...
# $ Dose.Time      : POSIXct, format: "2019-06-07 07:53:00" "2019-06-07 07:53:00" "2019-06-07 07:53:00" "2019-06-07 07:53:00" ...
# $ Time.After.Dose: num  0.5 1 1.5 2 2.5 3 4 6 8 10
# - attr(*, ".internal.selfref")=<externalptr> 

# Create a new column shows the time differences as hours
dat[, Time.After.Dose := as.double(Sample.Time - Dose.Time, units = "hours")]
print(dat)
#             Sample.Time           Dose.Time Time.After.Dose
#  1: 2019-06-07 08:23:00 2019-06-07 07:53:00             0.5
#  2: 2019-06-07 08:53:00 2019-06-07 07:53:00             1.0
#  3: 2019-06-07 09:23:00 2019-06-07 07:53:00             1.5
#  4: 2019-06-07 09:53:00 2019-06-07 07:53:00             2.0
#  5: 2019-06-07 10:23:00 2019-06-07 07:53:00             2.5
#  6: 2019-06-07 10:53:00 2019-06-07 07:53:00             3.0
#  7: 2019-06-07 11:53:00 2019-06-07 07:53:00             4.0
#  8: 2019-06-07 13:53:00 2019-06-07 07:53:00             6.0
#  9: 2019-06-07 15:53:00 2019-06-07 07:53:00             8.0
# 10: 2019-06-07 17:53:00 2019-06-07 07:53:00            10.0
1 голос
/ 01 февраля 2020

Вы можете использовать lubridate для преобразования символов даты в POSIXct формат и затем выполнить вычитание.

#The first three lines of your data
df <- data.frame(
  sample.time = c("2019-06-07T08:23","2019-06-07T08:53","2019-06-07T09:23"),
  dose.time = c("2019-06-07T07:53", "2019-06-07T07:53","2019-06-07T07:53"), stringsAsFactors = F
)

library(lubridate)

df$sample.time<-ymd_hm(df$sample.time)
df$dose.time<-ymd_hm(df$dose.time)

#Change the difference in minutes to hours and set it as a numeric value
df$Time.After.Dose <- as.numeric((df$sample.time - df$dose.time) / 60)

#          sample.time           dose.time Time.After.Dose
#1 2019-06-07 08:23:00 2019-06-07 07:53:00             0.5
#2 2019-06-07 08:53:00 2019-06-07 07:53:00             1.0
#3 2019-06-07 09:23:00 2019-06-07 07:53:00             1.5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...