[英]Subtracting seconds from one row and setting result to a different row in R
我有一個 dataframe,其中第一列是時間。 我當前的 output 看起來像:
0:0:0
0:0:0
下午 5 點 43 分 42 秒
下午 5 點 43 分 52 秒
我正在嘗試讓我的代碼的一部分搜索其中包含 0:0:0 值的任何行,並從其中包含值的最近行中減去 10 秒。 期望的結果如下所示:
下午 5 點 43 分 22 秒
下午 5 點 43 分 32 秒
下午 5 點 43 分 42 秒
下午 5 點 43 分 52 秒
我已經編寫了這部分代碼來為我做這件事。 它運行沒有錯誤,但實際上並沒有改變任何值。
entries<-length(data$Time)
for(j in entries:1)
if(data[j,1]=="0:0:0"){
for(k in j-1:1)
if(data[k,1]!="0:0:0"){
data[k,1] <- as.POSIXct(data[k,1], format = "%H:%M:%S")
value <- format(data[k,1] + seconds(10))
data[j,1] <- value
break
}
}
對 go 關於創建這個有什么建議嗎?
假設您數據中的最后一個值不是'0:0:0'
,您可以執行以下操作:
將Time
替換為值為0:0:0
的NA
,並將它們轉換為POSIXct
class。
library(dplyr)
df %>%
mutate(Time = na_if(Time, '0:0:0'),
Time1 = as.POSIXct(Time, format = '%T')) -> df1
通過從下一個值中減去 10 秒來替換NA
值。
for(i in nrow(df1):1) {
if(is.na(df1$Time1[i])) {
df1$Time1[i] <- df1$Time1[i + 1] - 10
}
}
以我們需要的所需format
(H:M:S) 更改POSIXct
。
df1 %>%
mutate(Time = format(Time1, '%T'),
Time1 = NULL) -> result
result
# Time
#1 05:43:22
#2 05:43:32
#3 05:43:42
#4 05:43:52
數據
df <- structure(list(Time = c("0:0:0", "0:0:0", "5:43:42", "5:43:52"
)), class = "data.frame", row.names = c(NA, -4L))
這是一個data.table
方法,假設您的意思是“具有值的最近行”,是不是“0:0:0”的最近的下一行:
library(data.table)
DT <- data.table(Time=c("0:0:0", "0:0:0", "5:43:42 pm", "5:43:52 pm",
"0:0:0", "6:43:52 pm"), c2=LETTERS[1:6])
DT[Time=="0:0:0", Time := NA]
DT[, Time := as.POSIXct(Time, format = "%I:%M:%S %p")]
i <- which(is.na(DT$Time))
DT[, idx:=cumsum(!is.na(Time))]
DT[, idx:=rev(seq(.N)), by=idx]
DT[, Time := nafill(Time, type="nocb")]
DT[i, Time:=Time - (10*idx)][, idx:=NULL]
DT[, Time := format(Time, '%I:%M:%S %p')][]
#> Time c2
#> 1: 05:43:22 PM A
#> 2: 05:43:32 PM B
#> 3: 05:43:42 PM C
#> 4: 05:43:52 PM D
#> 5: 06:43:42 PM E
#> 6: 06:43:52 PM F
由代表 package (v0.3.0) 於 2020 年 12 月 30 日創建
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.