我有這個資料框:
| 日期 | 事件 | 設備 | 面具 |
|---|---|---|---|
| 2021/12/08 | 進入設備 | L1 | 一個 |
| 2021/12/09 | 解耦 | 不適用 | 一個 |
| 2021/12/09 | 狀態變化 | 不適用 | 一個 |
| 2021/12/10 | 休假設備 | L1 | 一個 |
| 2021/12/10 | 進入設備 | L1 | 乙 |
| 2021/12/11 | 解耦 | 不適用 | 乙 |
| 2021/12/11 | 狀態變化 | 不適用 | 乙 |
| 2021/12/11 | 休假設備 | L1 | 乙 |
我想創建一個包含設備列資料的新列,并將NA值替換為上面的框。我寫了這段代碼
DC<-df[order(df$MASK,df$TIMESTAMP),]
Equipement_Correct <- df$EQUIPMENT
Equipement_Correct <-ifelse(is.na(as.character(Equipement_Correct [2:nrow(DC)]))&as.character(DC$MASK[2:nrow(DC)])==as.character(DC$MASK[1:nrow(DC)-1]) & (as.character(DC$EVENT[2:nrow(DC)])=='decouple' | as.character(DC$EVENT[2:nrow(DC)])=='stateChange' |,
as.character(Equipement_Correct [1:nrow(DC)-1]),
as.character(Equipement_Correct [2:nrow(DC)]))
Equipement_Correct <-c(NA,Equipement_Correct )
dfOut<-data.frame(DC,Equipement_Correct)
我得到:
| 日期 | 事件 | 設備 | 面具 | 設備_正確 |
|---|---|---|---|---|
| 2021/12/08 | 進入設備 | L1 | 一個 | L1 |
| 2021/12/09 | 解耦 | 不適用 | 一個 | L1 |
| 2021/12/09 | 狀態變化 | 不適用 | 一個 | 不適用 |
| 2021/12/10 | 休假設備 | L1 | 一個 | L1 |
| 2021/12/10 | 進入設備 | L2 | 乙 | L1 |
| 2021/12/11 | 解耦 | 不適用 | 乙 | L2 |
| 2021/12/11 | 狀態變化 | 不適用 | 乙 | 不適用 |
| 2021/12/11 | 休假設備 | L1 | 乙 | L2 |
我想得到:
| 日期 | 事件 | 設備 | 面具 | 設備_正確 |
|---|---|---|---|---|
| 2021/12/08 | 進入設備 | L1 | 一個 | L1 |
| 2021/12/09 | 解耦 | 不適用 | 一個 | L1 |
| 2021/12/09 | 狀態變化 | 不適用 | 一個 | L1 |
| 2021/12/10 | 休假設備 | L1 | 一個 | L1 |
| 2021/12/10 | 進入設備 | L2 | 乙 | L1 |
| 2021/12/11 | 解耦 | 不適用 | 乙 | L2 |
| 2021/12/11 | 狀態變化 | 不適用 | 乙 | L2 |
| 2021/12/11 | 休假設備 | L1 | 乙 | L2 |
通過在我的代碼上使用回圈,我設法獲得了想要的結果,但我不想使用回圈,因為我處理了數百萬行,
for (i in 1:5) {
Equipement_Correct <-ifelse(is.na(as.character(Equipement_Correct [2:nrow(DC)]))&as.character(DC$MASK[2:nrow(DC)])==as.character(DC$MASK[1:nrow(DC)-1]) & (as.character(DC$EVENT[2:nrow(DC)])=='decouple' | as.character(DC$EVENT[2:nrow(DC)])=='stateChange' |,
as.character(Equipement_Correct [1:nrow(DC)-1]),
as.character(Equipement_Correct [2:nrow(DC)]))
Equipement_Correct <-c(NA,Equipement_Correct )
}
有沒有辦法不使用回圈?
uj5u.com熱心網友回復:
假設在資料庫中的事件條目是有序和完整如圖所示,你可以強制對factor和背部as.integer,在這種情況下,給出了EVENT_N與c(1, 2, 3, 4)重復的“永遠”。現在,您可以利用cumsum我們在 modulo 的零值上計算的%% 4,即結果 的累積和TRUE。我們需要減去- 1以獲得正確的滯后。
lv <- c("enterEquipment", "Decouple", "stateChange", "leaveEquipment")
dat <- within(dat, {
EVENT_N <- as.integer(factor(EVENT, levels=lv))
Equipement_Correct <- paste0('L', cumsum(EVENT_N %% 4 - 1 == 0))
rm(EVENT_N) ## removes temporary column
})
dat
# DATE EVENT EQUIPMENT MASK Equipement_Correct
# 1 2021/12/08 enterEquipment L1 a L1
# 2 2021/12/09 Decouple <NA> a L1
# 3 2021/12/09 stateChange <NA> a L1
# 4 2021/12/10 leaveEquipment L1 a L1
# 5 2021/12/10 enterEquipment L2 b L2
# 6 2021/12/11 Decouple <NA> b L2
# 7 2021/12/11 stateChange <NA> b L2
# 8 2021/12/11 leaveEquipment L1 b L2
也許使用Key 資料框而不是factor.
K <- data.frame(matrix(c("enterEquipment", "Decouple", "stateChange",
"leaveEquipment", 1:4), ncol=2)) |>
type.convert(as.is=TRUE)
within(dat, {
Equipement_Correct <-
paste0('L', cumsum(K[match(EVENT, K[, 1]), 2] %% 4 - 1 == 0))
})
資料:
dat <- structure(list(DATE = c("2021/12/08", "2021/12/09", "2021/12/09",
"2021/12/10", "2021/12/10", "2021/12/11", "2021/12/11", "2021/12/11"
), EVENT = c("enterEquipment", "Decouple", "stateChange", "leaveEquipment",
"enterEquipment", "Decouple", "stateChange", "leaveEquipment"
), EQUIPMENT = c("L1", NA, NA, "L1", "L2", NA, NA, "L1"), MASK = c("a",
"a", "a", "a", "b", "b", "b", "b"), Equipement_Correct = c("L1",
"L1", NA, "L1", "L1", "L2", NA, "L2")), class = "data.frame", row.names = c(NA,
-8L))
uj5u.com熱心網友回復:
使用這個包'zoo',你可以獲得函式na.locf(最后一次觀察結轉)
install.packages(zoo)
library(zoo)
data$EQUIPMENT <- na.locf(data$EQUIPMENT)
eg: > library(zoo)
> data <- data.frame(New= c("L1",NA,NA,"L2",NA,"L3",NA,NA), old = 1:8)
> data
New old
1 L1 1
2 <NA> 2
3 <NA> 3
4 L2 4
5 <NA> 5
6 L3 6
7 <NA> 7
8 <NA> 8
> data$New <- na.locf(data$New)
> data
New old
1 L1 1
2 L1 2
3 L1 3
4 L2 4
5 L2 5
6 L3 6
7 L3 7
8 L3 8
uj5u.com熱心網友回復:
您也可以tidyr::fill為此目的使用:
library(tidyr)
df %>%
fill(Equipement_Correct, .direction = "down")
DATE EVENT EQUIPMENT MASK Equipement_Correct
1 2021/12/08 enterEquipment L1 a L1
2 2021/12/09 Decouple <NA> a L1
3 2021/12/09 stateChange <NA> a L1
4 2021/12/10 leaveEquipment L1 a L1
5 2021/12/10 enterEquipment L2 b L1
6 2021/12/11 Decouple <NA> b L2
7 2021/12/11 stateChange <NA> b L2
8 2021/12/11 leaveEquipment L1 b L2
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/394658.html
標籤:r
上一篇:如何從任何環境更改物件?
下一篇:從匹配的子字串中改變R中的新列
