2014-09-25 2 views
1

Мои данные выглядит следующим образом:Создать столбец, значения которого являются суммами значений в другом столбце, основанные на определенных условиях в г

ROW ID DATE  DO CO FLAG 
1 6405 9/16/2010 1000 . 1 
2 6405 9/16/2010  0 32 2 
3 6405 9/17/2010 500 . 1 
4 6405 9/17/2010 1000 . 1 
5 6405 9/17/2010 1000 . 1 
6 6405 9/18/2010 1000 . 1 
7 6405 9/18/2010  0 37 2 
8 6405 9/18/2010 1250 . 1 
9 6405 9/19/2010 1000 . 1 
10 6405 9/19/2010 1000 . 1 
11 6405 9/19/2010  0 65 2 
12 6405 9/20/2010 500 . 0 
13 6405 9/21/2010 1250 . 0 
14 2654 8/4/2010 1000 . 0 
15 2654 8/5/2010  0 15 2 
16 2654 8/5/2010 900 . 1 
17 2654 8/5/2010 300 . 1 
18 2654 8/6/2010 750 . 0 
19 2654 8/7/2010 1000 . 1 
20 2654 8/7/2010  0 45 2 
21 4567 6/8/2010 670 . 1  
22 4567 6/8/2010 700 . 1  
23 4567 6/8/2010  0 34 2   
24 4567 6/8/2010 1000 . 1  
25 4567 6/8/2010  500 . 1 

Мои данные должны выглядеть следующим образом:

ROW ID  DATE  DO  CO FLAG TDD1 
1 6405 9/16/2010 1000 . 1 1000 
2 6405 9/16/2010  0 32 2 0 
3 6405 9/17/2010 500 . 1 2500 
4 6405 9/17/2010 1000 . 1 2500 
5 6405 9/17/2010 1000 . 1 2500 
6 6405 9/18/2010 1000 . 1 1000 
7 6405 9/18/2010  0 37 2 0 
8 6405 9/18/2010 1250 . 1 1250 
9 6405 9/19/2010 1000 . 1 2000 
10 6405 9/19/2010 1000 . 1 2000 
11 6405 9/19/2010  0 65 2 0 
12 6405 9/20/2010 500 . 0 500 
13 6405 9/21/2010 1250 . 0 1250 
14 2654 8/4/2010 1000 . 0 1000 
15 2654 8/5/2010  0 15 2 0 
16 2654 8/5/2010  900 . 1 1200 
17 2654 8/5/2010  300 . 1 1200 
18 2654 8/6/2010  750 . 0 750 
19 2654 8/7/2010 1000 . 1 1000 
20 2654 8/7/2010  0 45 2 0 
21 4567 6/8/2010  670 . 1 1370 
22 4567 6/8/2010  700 . 1 1370 
23 4567 6/8/2010  0 34 2 0 
24 4567 6/8/2010 1000 . 1 1500 
25 4567 6/8/2010  500 . 1 1500 

Так что я хочу для создания столбца TDD1, где для каждого идентификатора, последовательно повторяющего даты, соответствующее значение в столбце TDD1 должно быть суммой значений в столбце DO для тех последовательно повторяющихся дат. Например, см. Строки 3,4,5.

Если значение столбца FLAG равно 2 или 0, то соответствующее значение TDD1 должно быть значением DO для этой строки. Например, см. Строки 2,7,11,15 и 20 (для FLAG = 2) и строки 12,13,14,18 и 23 (для FLAG = 0).

Столбец FLAG последовательно повторяет 1 для последовательно повторяющихся дат для каждого идентификатора, за исключением случаев, когда столбец СО имеет значение, и в этом случае значение FLAG равно 2. Например, см. Строки с 9 по 11. В случае строк с 6 по 8, даты повторяются последовательно, однако столбец FLAG не имеет последовательных 1. Таким образом, в таких ситуациях, когда 1 не происходят последовательно или происходят изолированно для конкретной даты и идентификатора, значение TDD1 должно быть таким же, как значение DO для этой строки. Также смотрите строки 19, 20.

Другое значение, если значение FLAG 2 встречается в ряду строк, имеющих одинаковые даты, вычисление столбца TDD1 необходимо сбросить. Например, см. Строки с 21 по 25. Обратите внимание, что строки 21 и 22 имеют значение TDD1 1370 (670 + 700), а строки 24,25 имеют значение TDD1 1500 (1000 + 500).

Было бы очень полезно, если бы вы могли предоставить код r для этого. Спасибо.

+0

Вы делали какие-либо попытки на этом? – DMT

+0

@DMT: Я сделал неудачные попытки. Я не могу прийти к коду, который может удовлетворить все вышеперечисленные ситуации. Способ, которым я его вижу, cumsum() имеет свою утилиту в этом сценарии для вычисления значений DO. Однако строки, имеющие значения СО, увеличивают сложность. И вычисление необходимо сбросить, когда FLAG = 2 происходит между рядами с одинаковой датой повторения последовательно. Есть предположения? –

+0

Вы пытались, вместо того, чтобы создавать общую функцию, которая обрабатывает все это одним выстрелом, обрабатывать партии последовательно повторяющихся дат? Исключение вашей проблемы таким образом, похоже, облегчает жизнь, предполагая, что я правильно понимаю, что только ссылки с одинаковыми датами связаны при вычислении TDD1 – DMT

ответ

0

Я не знаю об эффективности, но вот альтернатива с использованием dplyr пакета (и%>% от magrittr для некоторой удобочитаемости кода).

library(magrittr) 
library(dplyr) 

data <- data %>% 
    mutate(flag_1_consecutive = cumsum(!FLAG %in% 1)) %>% 
    group_by(ID, DATE, FLAG, flag_1_consecutive) %>% 
    mutate(TDD1 = sum(DO)) 

То, что я сделал, было группирование строк по вашим правилам, которые были определенные ID, дата и последовательных флагов «1». Тогда я только что подвел итоги DO.

+1

Большое вам спасибо. Оно работает! Просто чтобы понять, что вы имели в виду по эффективности? –

+0

Я имел в виду скорость, потому что код создает некоторые вспомогательные вещи. Но я думаю, это не будет проблемой, так как эти процедуры dplyr сделаны быстрыми. – Athos

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