data.table或dplyr - 数据操纵

6
我有以下数据。
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

我需要的输出是上面显示的日期和计数列。 - BigDataScientist
2个回答

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(没有点),方便链式操作。因此,如果需要,在下一步操作中可以同时使用 .NN


8
太好了!谢谢。我更喜欢使用data.table选项。 - BigDataScientist
2
谢谢@Arun。我对数据表还比较新,但我开始喜欢它了。 :) - lukeA
2
еңЁ dplyr дёӯпјҢдҪҝз”Ё filter еңЁ col1 дёҠеҺ»йҮҚеҸҜиғҪжӣҙжңүж•ҲпјҢеҚі df %.% arrange(Date) %.% filter(!duplicated(Col1)) %.% group_by(Date) %.% summarise(Count=length(Date)) %.% mutate(Count = cumsum(count))гҖӮ - mnel
1
我和@mnel一样认为,如果您始终使用%.%,dplyr代码看起来会好得多。 - hadley
@mnel 使用 n() 而不是 length 也许更好。抄送 @hadley - dickoa
显示剩余2条评论

0

使用ddply和duplicated,你只需要这样做

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

例如,您首先按照日期和Col1对所有夫妻进行计数,然后删除重复的列。最后再计算列。

在此之前,您的数据必须进行排序。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接