我有一个数据集示例,我想使用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
的值。
答案 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