【问题标题】:loop for list element with datetime in r在r中循环使用日期时间的列表元素
【发布时间】:2019-01-15 17:28:37
【问题描述】:

在 r 中循环使用日期时间的列表元素

我有一个名称错误的 df。我将错误 df 按 ID 拆分。现在我的列表中有 300 多个不同的对象。

library(dplyr)
df <- split.data.frame(mistake, mistake$ID)

每个列表对象都有两个不同的日期时间戳。起初我需要这两个日期时间戳之间的分钟数。然后我通过变量 stay 复制对象的行(这也是 sat 和 end 时间之间的差异时间)。然后我用增量 n_mintes 覆盖测试变量。

library(lubridate)
start_date <- df[[1]]$datetime
end_date <- df[[1]]$gehtzeit
n_minutes <- interval(start_date,end_date)/minutes(1)
see <- start_date + minutes(0:n_minutes)#the diff time in minutes I need 
df[[1]]$test<- Sys.time()#a new variable 
df[[1]] <- data.frame(df[[1]][rep(seq_len(dim(df[[1]])[1]),df[[1]]$stay+1),1:17, drop= F], row.names=NULL)
df[[1]]$test <- format(start_date + minutes(0:n_minutes), format = "%d.%m.%Y %H:%M:%S")

我想对列表中的每个对象执行此操作。然后“rbind”或“unsplit”我的列表。我知道我需要一个循环。但我不知道如何对列表元素执行此操作。 将创建任何帮助!

这是一个小的 df 示例;

mistake


Baureihe Verbund      Fahrzeug Code                           Codetext    Subsystem          Kommt.Zeit
71      411 ICE1166 93805411866-7 1A50 Querfederdruck 1 ungleich Sollwert Neigetechnik 29.07.2018 23:00:07
72      411 ICE1166 93805411866-7 1A50 Querfederdruck 1 ungleich Sollwert Neigetechnik 04.08.2018 11:16:41
             Geht.Zeit           Anstehdauer Jahr Monat   KW Tag Wartung.geht            datetime            gehtzeit
71 29.07.2018 23:02:56 00 Std 02 Min 49 Sek  2018     7 KW30  29            0 2018-07-29 23:00:00 2018-07-29 23:02:00
72 04.08.2018 11:19:20 00 Std 02 Min 39 Sek  2018     8 KW31   4            0 2018-08-04 11:16:00 2018-08-04 11:19:00
   bleiben                                           ID
71  2 secs 2018-07-29 23:00:00 2018-07-29 23:02:00 1A50
72  3 secs 2018-08-04 11:16:00 2018-08-04 11:19:00 1A50

这是结构:

    str(mistake)
'data.frame':   2 obs. of  18 variables:
 $ Baureihe    : int  411 411
 $ Verbund     : Factor w/ 1 level "ICE1166": 1 1
 $ Fahrzeug    : Factor w/ 7 levels "93805411066-4",..: 7 7
 $ Code        : Factor w/ 6 levels "1A07","1A0E",..: 3 3
 $ Codetext    : Factor w/ 6 levels "ITD Karte gestört",..: 5 5
 $ Subsystem   : Factor w/ 1 level "Neigetechnik": 1 1
 $ Kommt.Zeit  : Factor w/ 70 levels "02.08.2018 00:07:23",..: 68 6
 $ Geht.Zeit   : Factor w/ 68 levels "01.08.2018 01:30:25",..: 68 8
 $ Anstehdauer : Factor w/ 46 levels "00 Std 00 Min 01 Sek ",..: 12 4
 $ Jahr        : int  2018 2018
 $ Monat       : int  7 8
 $ KW          : Factor w/ 5 levels "KW27","KW28",..: 4 5
 $ Tag         : int  29 4
 $ Wartung.geht: int  0 0
 $ datetime    : POSIXlt, format: "2018-07-29 23:00:00" "2018-08-04 11:16:00"
 $ gehtzeit    : POSIXlt, format: "2018-07-29 23:02:00" "2018-08-04 11:19:00"
 $ bleiben     :Class 'difftime'  atomic [1:2] 2 3
  .. ..- attr(*, "units")= chr "secs"
 $ ID          : chr  "2018-07-29 23:00:00 2018-07-29 23:02:00 1A50" "2018-08-04 11:16:00 2018-08-04 11:19:00 1A50"

【问题讨论】:

  • 请用dput展示一个可重复的小例子
  • 曾在哪里使用过查看(即我需要的差异时间(以分钟为单位)?

标签: r list loops datetime posixlt


【解决方案1】:

考虑构建一个通用的用户定义函数,该函数接收数据帧作为输入参数。然后,使用by 调用该函数。与split 一样,by 也通过一个或多个因素(例如 ID)对数据帧进行子集化,但与split 不同,by 然后可以将子集传递给函数。要将所有行绑定在一起,请在最后运行do.call

下面删除了多余的df$test &lt;- Sys.time(),它稍后会被覆盖,并在结束时使用format()调用中的see对象以避免重新计算和重复。

calc_datetime <- function(df) {
   # INITIAL CALCS
   start_date <- df$datetime
   end_date <- df$gehtzeit
   n_minutes <- interval(start_date, end_date)/minutes(1)
   see <- start_date + minutes(0:n_minutes) # the diff time in minutes I need 

   # BUILD OUTPUT DF
   df <- data.frame(df[rep(seq_len(dim(df)[1]), df$stay+1), 1:17, drop= F], row.names=NULL)
   df$test <- format(see, format = "%d.%m.%Y %H:%M:%S")

   return(df)
}

# BUILD LIST OF SUBSETTED DFs
df_list <- by(mistake, mistake$ID, calc_datetime)

# APPEND ALL RESULT DFs TO SINGLE FINAL DF
final_df <- do.call(rbind, df_list)

【讨论】:

  • 总而言之,我只能说一件事:非常感谢它运行良好。正是我想要的!谢谢谢谢谢谢
  • 哈哈...听起来不错!乐意效劳。请注意 StackOverflow 的说法 thanks
【解决方案2】:

与 Parfait 的回答相同,并使用相同的用户定义函数 calc_datetime,但我会使用 purrr 包中的 map_dfr

df_list <- split(mistake, mistake$ID)
final_df <- map_dfr(df_list, calc_datetime)

如果您更新问题以获得我可以使用的数据,我可以提供一个有效的演示

【讨论】:

  • 总而言之,我只能说一件事:非常感谢它运行良好。正是我想要的!谢谢谢谢谢谢
  • 很高兴它成功了!您应该接受最适合您的答案(可能是 Parfait,因为他们完成了大部分工作)并投票赞成您认为有帮助的任何答案
猜你喜欢
  • 2018-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
  • 1970-01-01
  • 2020-08-12
  • 1970-01-01
相关资源
最近更新 更多