我正在嘗試創建一個回圈和一個 if/else 陳述句來提取下一行的時間以將其記錄為超時。如果沒有下一行(即沒有汽車 ID#)作為結束/退出回傳。 資料和預期輸出
這是我的代碼,但它根本不起作用,可能沒有掌握正確的基礎知識。
for(i in 1:dim(df2)[1]){
if(df2$car.id[i] == df2$car.id[i 1]){
return$timein[i 1]
}else{
print("end")
}
}
)
uj5u.com熱心網友回復:
下面有幾個注意事項,但先試試這個:
df2$Timeout <- ave(df2$Timein, df2$car.id, FUN = function(z) c(z[-1], NA))
上面的代碼回傳df2$Timein perdf2$car.id的下一個值,當下一行不同時正確重置car.id。順序很重要,所以如果你需要Timein排序,那么你應該在呼叫ave(.). (這將正確處理car.id亂序甚至混合。)
您的(影像)代碼問題。如果上述方法不起作用,您需要澄清這些要點。
nrow(df2)是比 更規范的方法dim(df2)[1]。nrow(.)不過,我建議使用代替for (i in seq_len(nrow(df2))),因為它至少在一種極端情況下表現更好。您的
[i 1]索引將超出索引限制并回傳 NA,最終會出錯missing value where TRUE/FALSE needed。return$timein[i 1]似乎是錯誤的,除非您有一個命名串列或data.frame物件return;我不鼓勵這樣做,因為它可能會(人們)與基本的 R 原語(函式)混淆return(.)。如果它不是一個物件,那么你使用它是錯誤的,坦率地說,我不知道它應該是什么,因為這里的 for 回圈似乎沒有必要。您的預期輸出并不完全清楚,但我猜您想要時間戳或文字
"End". 后者將破壞您的時間戳,將它們從POSIXt-class 物件轉換為字串。通常,框架中的列不能是混合類。
uj5u.com熱心網友回復:
嘗試使用dplyr. 處理玩具資料。
library(dplyr)
dat %>% group_by( car.id ) %>%
mutate( Timeout=lead(as.character(Timein), default="END") ) %>% ungroup
# A tibble: 10 x 4
car.id car.type Timein Timeout
<dbl> <dbl> <dttm> <chr>
1 14359825 1 2021-12-18 17:28:58 2021-12-18 17:33:58
2 14359825 1 2021-12-18 17:33:58 2021-12-18 18:03:58
3 14359825 1 2021-12-18 18:03:58 2021-12-18 18:08:58
4 14359825 1 2021-12-18 18:08:58 2021-12-18 18:13:58
5 14359825 1 2021-12-18 18:13:58 END
6 243095743 2 2021-12-18 18:30:38 2021-12-18 18:37:18
7 243095743 2 2021-12-18 18:37:18 2021-12-18 19:17:18
8 243095743 2 2021-12-18 19:17:18 2021-12-18 19:23:58
9 243095743 2 2021-12-18 19:23:58 2021-12-18 19:30:38
10 243095743 2 2021-12-18 19:30:38 END
如果你想要一個僅限日期的Timeout列,你可以隨時重鑄
as.POSIXct( dat$Timeout, format="%F %T" )
[1] "2021-12-18 17:33:58 CET" "2021-12-18 18:03:58 CET"
[3] "2021-12-18 18:08:58 CET" "2021-12-18 18:13:58 CET"
[5] NA "2021-12-18 18:37:18 CET"
[7] "2021-12-18 19:17:18 CET" "2021-12-18 19:23:58 CET"
[9] "2021-12-18 19:30:38 CET" NA
或直接使用
dat %>% group_by( car.id ) %>% mutate( Timeout=lead( Timein ) )
資料
dat <- structure(list(car.id = c(14359825, 14359825, 14359825, 14359825,
14359825, 243095743, 243095743, 243095743, 243095743, 243095743
), car.type = c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2), Timein = structure(c(1639844938.6685,
1639845238.6685, 1639847038.6685, 1639847338.6685, 1639847638.6685,
1639848638.6685, 1639849038.6685, 1639851438.6685, 1639851838.6685,
1639852238.6685), class = c("POSIXct", "POSIXt"))), row.names = c(NA,
10L), class = "data.frame")
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/386100.html
上一篇:openvx 4: 資料結構
