/ / R Erstellen eines neuen Vektors basierend auf einer Anzahl von Werten bis zur ersten Instanz eines Werts eines vorhandenen Vektors - r, count

R Erstellen eines neuen Vektors basierend auf einer Anzahl von Werten bis zur ersten Instanz eines Werts eines vorhandenen Vektors - r, count

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 № 1

Eine 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