2014-01-28 3 views
6

У меня есть следующие данныеdata.table или dplyr - данные манипуляции

Date   Col1  Col2 
2014-01-01  123  12 
2014-01-01  123  21 
2014-01-01  124  32 
2014-01-01  125  32 
2014-01-02  123  34 
2014-01-02  126  24 
2014-01-02  127  23 
2014-01-03  521  21 
2014-01-03  123  13 
2014-01-03  126  15 

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

Date   Count 
2014-01-01  3 i.e. 123,124,125 
2014-01-02  5 (2 + above 3) i.e. 126, 127 
2014-01-03  6 (1 + above 5) i.e. 521 only 
+0

Вывод, который я ищу, это столбцы Date и Count, показанные выше. – BigDataScientist

ответ

17
library(dplyr) 
df %.% 
    arrange(Date) %.% 
    filter(!duplicated(Col1)) %.% 
    group_by(Date) %.% 
    summarise(Count=n()) %.% # n() <=> length(Date) 
    mutate(Count = cumsum(Count)) 
# Source: local data frame [3 x 2] 
# 
#   Date Count 
# 1 2014-01-01  3 
# 2 2014-01-02  5 
# 3 2014-01-03  6 

library(data.table) 
dt <- data.table(df, key="Date") 
dt <- unique(dt, by="Col1") 
(dt <- dt[, list(Count=.N), by=Date][, Count:=cumsum(Count)]) 
#   Date Count 
# 1: 2014-01-01  3 
# 2: 2014-01-02  5 
# 3: 2014-01-03  6 

Или

dt <- data.table(df, key="Date") 
dt <- unique(dt, by="Col1") 
dt[, .N, by=Date][, Count:=cumsum(N)] 

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

+8

Отлично! Спасибо. Мне нравится опция data.table лучше. – BigDataScientist

+2

Спасибо @Arun. Я довольно новичок в таблице данных. Но я начинаю любить его. :) – lukeA

+2

Может быть более эффективным (в 'dplyr') использовать' filter' для дедупликации на 'col1', то есть' df%.% Arr (Date)%.% Filter (! Duplicated (Col1))% % group_by (Date)%.% summary (Count = length (Date))%.% mutate (Count = cumsum (count)) '. – mnel

0

С ddply и дублируется, вы просто должны сделать

df <- ddply(data, .(Date, Col1), nrow) 
df2 <- ddply(df[!duplicated(df$Col1),], .(Date), nrow) 
ddply(df2, .(Date, V1), nrow) 

т.е. вы первый подсчет для всех пар Дата, Col1, а затем удалить дублированные столбцы. Вы, наконец, считаете колонии.

Ваши данные должны быть отсортированы ранее.

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

  • Нет связанных вопросов^_^