Wie kann ich eine neue Variable "CountWK" erstellen, die auf der Anzahl der Werte in "WK" basiert, die bis zur ersten Instanz von "1" in "Performance", gruppiert nach "ID", auftreten?
ID<-c("A", "A", "A", "B", "B", "B", "C", "C", "C", "C", "C")
WK<-c(1, 2, 3, 1, 2, 3, 1, 2, 3, 4, 5)
Performance<-c(0,1,1,0,1,0,0,1,0,1,1)
Data<-data.frame(ID, WK, Performance)
Für ID "A" wäre CountWk also "2", für "B" "2" und für C "2" mit dem Wert N / A in "CountWk" für jede zweite Zeile außer derjenigen, die die erste Instanz enthält von "1" in "Leistung".
Antworten:
3 für die Antwort № 1Eine Option mit dplyr
library(dplyr)
Data %>%
group_by(ID) %>%
mutate(CountWk= ifelse(cumsum(Performance==1)==1 & Performance!=0,
WK, NA_real_))
# ID WK Performance CountWk
#1 A 1 0 NA
#2 A 2 1 2
#3 A 3 1 NA
#4 B 1 0 NA
#5 B 2 1 2
#6 B 3 0 NA
#7 C 1 0 NA
#8 C 2 1 2
#9 C 3 0 NA
#10 C 4 1 NA
#11 C 5 1 NA
Oder ohne die ifelse
Data %>%
group_by(ID) %>%
mutate(CountWk= (NA^!(cumsum(Performance==1)==1 & Performance!=0)) *WK)
Oder verwenden base R
Data$CountWk <- with(Data, (NA^!(ave(Performance==1, ID, FUN=cumsum)==1&
Performance!=0)) * WK)
6 für die Antwort № 2
Hier ist, wie ich dies mit dem Ansatz würde data.table
Paket
Suchen Sie zuerst den Zeilenindex mit .I
und match
library(data.table)
indx <- setDT(Data)[, .I[match(1L, Performance)], by = ID]$V1
Dann zuweisen WK
zu CountWk
von diesem Index
Data[indx, CountWk := WK][]
# ID WK Performance CountWk
# 1: A 1 0 NA
# 2: A 2 1 2
# 3: A 3 1 NA
# 4: B 1 0 NA
# 5: B 2 1 2
# 6: B 3 0 NA
# 7: C 1 0 NA
# 8: C 2 1 2
# 9: C 3 0 NA
# 10: C 4 1 NA
# 11: C 5 1 NA