2015-10-24 3 views
1

У меня есть следующий кадр данных:Индексация по нескольким критериям между 2 кадра данных в R

id day event 
1  1 1 
1  3 1 
2  1 0 
2  4 0 
2  9 0 
2  15 0 
3  2 0 
3  5 0 
4  1 1 
4  8 1 
4  11 1 

Что я хочу, когда событие имеет нулевое значение, то все значения событий становятся одним исключением из последнего (по дате). Таким образом, выход должен быть следующим:

id day event 
1  1 1 
1  3 1 
2  1 1 
2  4 1 
2  9 1 
2  15 0 
3  2 1 
3  5 0 
4  1 1 
4  8 1 
4  11 1 

Любая помощь?

+1

Я считаю, что это 'событие', что он имеет в виду –

ответ

2

Мы могли бы использовать data.table. Преобразуйте 'data.frame' в 'data.table' (setDT(df1)), сгруппированный по 'id', ifany из 'event' равен 0 (!event) для этого конкретного 'id', мы реплицируем 1 для длины этого group -1 (.N-1) и объединить с 0 или else, чтобы вернуть значение «событие», назначить (:=) для обновления столбца «событие».

library(data.table) 
setDT(df1)[, event :=if(any(!event)) c(rep(1L, .N-1),0L) else event, by = id] 


df1 
# id day event 
# 1: 1 1  1 
# 2: 1 3  1 
# 3: 2 1  1 
# 4: 2 4  1 
# 5: 2 9  1 
# 6: 2 15  0 
# 7: 3 2  1 
# 8: 3 5  0 
# 9: 4 1  1 
#10: 4 8  1 
#11: 4 11  1 

Или с помощью dplyr мы группу по «идентификатору» и изменить столбец «событие», беря lead логического вектора, который тиражируется и добавить с другим логическим вектором (all(event)).

library(dplyr) 
df1 %>% 
    group_by(id) %>% 
    mutate(event= lead(rep(any(!event), n()), default=0) + all(event)) 
#  id day event 
# (int) (int) (dbl) 
#1  1  1  1 
#2  1  3  1 
#3  2  1  1 
#4  2  4  1 
#5  2  9  1 
#6  2 15  0 
#7  3  2  1 
#8  3  5  0 
#9  4  1  1 
#10  4  8  1 
#11  4 11  1 
+0

Спасибо. Только для записи: у меня была следующая проблема с этой строкой кода (http://stackoverflow.com/questions/16361225/unable-to-perform-calculations-using-r-data-table-package). Поэтому я включил выражение if внутри в as.numeric(). –