Как вернуть фрейм данных при использовании lapply с объектом даты и времени - PullRequest
0 голосов
/ 24 апреля 2018

Я хочу добавить одну минуту к временной отметке конкретных случаев. Скажи, что у меня есть

timestamp <- seq(
  from = as.POSIXct("12/05/2017 9:00", format = "%m/%d/%Y %H:%M"), 
  by = 60, 
  to = as.POSIXct("12/05/2017 9:02", format = "%m/%d/%Y %H:%M"))   
ID <- seq(from = 101, by = 1, to = 115)
df <- data.frame(ID, timestamp)

Чтобы применить к списку дел, я попробовал следующее:

vars <- list(101, 102, 103)

foo <- function(x) { 
  as.POSIXct(df$encounter[dat$ID == x], 
  format = "%m/%d/%Y %H:%M") + 60     
}

lapply(vars, foo)

, который возвращает правильные ответы в списке, но я не могу привести результаты к фрейму данных, чтобы их можно было добавить в исходный файл. Я нашел это решение здесь для возврата фрейма данных,

results <- lapply(vars, foo)
as.data.frame(do.call(rbind, results))

но возвращает метку времени в виде неформатированного числового объекта. Я пробовал индексировать по номеру дела

as.POSIXct(df$timestamp, format = "%m/%d/%Y %H:%M")[df$ID == 101] + 60

, который выводит правильный результат на экран, но я не могу определить правильный синтаксис для замены значений в самом кадре данных.

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

Вы можете использовать replace.

ind <- which(ID %in% c(101, 102, 103))
df$timestamp <- with(df, 
                     replace(timestamp
                            , ind
                            , timestamp[ind] + 60))

В tidyverse вы можете использовать case_when.

library(tidyverse)
df <- df %>% 
        mutate(timestamp = case_when(ID %in% c(101, 102, 103) ~ timestamp + 60,
                                      T ~ timestamp))
0 голосов
/ 24 апреля 2018

Я создам новый столбец, чтобы показать разницу. но вы можете просто заменить сверху.

transform(dat,a=strptime(timestamp,"%m/%d/%Y %H:%M")+60)
       ID      timestamp                   a
    1 123 12/4/2017 6:00 2017-12-04 06:01:00
    2 456 12/5/2017 7:00 2017-12-05 07:01:00
    3 789 12/6/2017 8:00 2017-12-06 08:01:00

если вам нужно отформатировать его обратно к вашим данным:

transform(dat,timestamp=format(strptime(timestamp,"%m/%d/%Y %H:%M")+60,"%m/%d/%Y %H:%M"))
   ID        timestamp
1 123 12/04/2017 06:01
2 456 12/05/2017 07:01
3 789 12/06/2017 08:01

Данные:

dat=read.table(text="ID    timestamp
123   '12/4/2017 6:00'
               456   '12/5/2017 7:00'
               789   '12/6/2017 8:00'",h=T,strings=F)
...