2015-04-12 7 views
4

Как создать новую переменную «CountWK», которая основана на подсчете значений в «WK», которые происходят до первого экземпляра «1» в «Производительности», сгруппированного по «ID»?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 "А" CountWk будет "2", за "B", "2", а для C "2" со значением N/A в "CountWk" для любого другого ряда, кроме тот, который содержит первый экземпляр «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 пакета

сначала найти индекс строки с помощью .I и match

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

Затем назначьте WK к CountWk по этому показателю

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 (данных) [Performance == 1, coutWK: = с (WK [1L], Rep (NA, .N-1L)), by = ID] 'будет работать, я думаю. – Arun

+0

Спасибо за быстрое решение! – user3594490

Смежные вопросы