添加秒数":00"如果缺少字符串

时间:2018-03-08 20:53:52

标签: r apply lapply

我有一个数据集示例,我想使用lapply(或apply系列的任何其他成员)将两个变量粘贴在一起,其中适用特定条件。

Dataframe示例:

df <- data.frame(v1=c('8','5','8','8','5','8'), 
v2=c('20:05:20','19:20','15:37:35','12:04:21','12:45','13:08:21'))

  v1       v2
1  8 20:05:20
2  5    19:20
3  8 15:37:35
4  8 12:04:21
5  5    12:45
6  8 13:08:21

我设法通过以下代码解决了我的问题,我在la {:00变量中使用lapply编写add,然后将它们粘贴在v3变量中。

df$add <- lapply(df$v1, function(x) if (x == 5) {paste(":00")} else {""})
df$v3 <- paste(df$v2,df$add, sep="")

  v1       v2 add       v3
1  8 20:05:20     20:05:20
2  5    19:20 :00 19:20:00
3  8 15:37:35     15:37:35
4  8 12:04:21     12:04:21
5  5    12:45 :00 12:45:00
6  8 13:08:21     13:08:21

我正在寻找一个解决方案,可以在一行代码中完成所有这些 - 特别是我想使用lapply并在v2添加已经在组合/粘贴时丢失:00的值。

3 个答案:

答案 0 :(得分:5)

使用替换(sub)的解决方案:

df$v3 <- sub("^([0-9]+:[0-9]+)$", "\\1:00", df$v2)
[1] "20:05:20" "19:20:00" "15:37:35" "12:04:21" "12:45:00" "13:08:21"

而不是使用digits:digits来循环替换模式:digits:digits:00(不会替换digits:digits:digits

编辑:OP想要apply系列的解决方案:

sapply(df$v2, function(x) sub("^([0-9]+:[0-9]+)$", "\\1:00", x))

答案 1 :(得分:1)

replace(v2, lengths(gregexpr(":", v2)) == 1, paste0(v2[lengths(gregexpr(":", v2)) == 1], ":00"))
#[1] "20:05:20" "19:20:00" "15:37:35" "12:04:21" "12:45:00" "13:08:21"

答案 2 :(得分:1)

Using data.table try:

dt[, v3 := ifelse(grepl(":\\d+:", v2), 
                 format(strptime(v2, "%H:%M:%S"), "%H:%M:%S"), 
                 format(strptime(v2, "%H:%M"), "%H:%M:%S"))]

Gives:

   v1       v2       v3
1:  8 20:05:20 20:05:20
2:  5    19:20 19:20:00
3:  8 15:37:35 15:37:35
4:  8 12:04:21 12:04:21
5:  5    12:45 12:45:00
6:  8 13:08:21 13:08:21