2015-04-12 63 views
4

如何創建基於「WK」中發生的值計數的新變量「CountWK」直到在「性能」中按「ID」分組的「1」的第一個實例?R如何基於值的計數創建新矢量現有矢量的值的第一個實例

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 「2」 與N/A的值 「CountWk」 爲每隔一行除了「Performance」中包含「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) 
+0

感謝您提供及時的解決方案和替代方案! – user3594490

+0

@ user3594490沒問題。這個問題很好。 – akrun

6

這是我將如何使用data.table

首先使用.Imatch找到行指數接近這個

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

也,'setDT(數據)[性能== 1,coutWK:= C(WK [1L],代表(NA,.N-1L)),通過= ID]'我會想辦法。 – Arun

+0

感謝您提供及時的解決方案! – user3594490