/ / R既存のベクトルの値の最初のインスタンスまでの値のカウントに基づいて新しいベクトルを作成する-r、count

R最初の値のインスタンスまでの値のカウントに基づいて新しいベクトルを作成する既存のベクトル-r、count

「ID」でグループ化された「パフォーマンス」の「1」の最初のインスタンスまでに発生する「WK」の値のカウントに基づく新しい変数「CountWK」を作成するにはどうすればよいですか?

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)

したがって、ID "A"の場合、CountWkは "2"、 "B"の場合は "2"、Cの場合は "CountWk"の値がN / Aの場合、最初のインスタンスを含む行以外のすべての行「パフォーマンス」の「1」の。

回答:

回答№1の場合は3

使用するオプション 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

またはなしで ifelse

  Data %>%
group_by(ID) %>%
mutate(CountWk= (NA^!(cumsum(Performance==1)==1 & Performance!=0)) *WK)

または base R

 Data$CountWk <- with(Data, (NA^!(ave(Performance==1, ID, FUN=cumsum)==1&
Performance!=0)) * WK)

回答№2の6

これが私がこれを使用してこれにアプローチする方法です data.table パッケージ

まず、を使用して行インデックスを見つけます .I そして match

library(data.table)
indx <- setDT(Data)[, .I[match(1L, Performance)], by = ID]$V1

次に、 WKCountWk そのインデックスによって

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