R新列总结了列组的数量

时间:2015-01-06 21:57:58

标签: r dataframe data.table dplyr

library(data.table)
df <- structure(
  list(
    type = c("AAA", "AAA", "AAA", "BCD", "BCD", "BCD", "EEE", "EEE", "EEE", "EEE"), 
    date = c("2015-01-01", "2015-01-01", "2015-01-01", "2015-01-02", "2015-01-05", "2015-01-05", "2015-01-04", "2015-01-04", "2015-01-04", "2015-01-04")
    ), 
  .Names = c("type", "date"), 
  class = "data.frame", 
  row.names = c(0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L))
df$date <- as.Date(df$date)
df

设置以下唯一名为'df'的示例数据框

  type       date
0  AAA 2015-01-01
1  AAA 2015-01-01
2  AAA 2015-01-01
3  BCD 2015-01-02
4  BCD 2015-01-05
5  BCD 2015-01-05
6  EEE 2015-01-04
7  EEE 2015-01-04
8  EEE 2015-01-04
9  EEE 2015-01-04

我正在寻求有关基础R,data.table, 甚至dplyr爱好者创造 a 新列,列出了数量 对于给定的“日期”,记录“类型”的次数。

  type       date typeDateGroup
0  AAA 2015-01-01             3 
1  AAA 2015-01-01             3
2  AAA 2015-01-01             3
3  BCD 2015-01-02             1
4  BCD 2015-01-05             2
5  BCD 2015-01-05             2
6  EEE 2015-01-04             4
7  EEE 2015-01-04             4
8  EEE 2015-01-04             4
9  EEE 2015-01-04             4

如果它有助于了解,与此示例相反,通常我的数据包括3-5毫米行。

不要运行它,这是我的尝试,它失败了......

library(data.table)
df <- as.data.table(df)
df<-df[order(type, date), `:=`(typeDateGroup = .N), by=type, date]

感谢您关注此事并主宰您的技能。

2 个答案:

答案 0 :(得分:5)

为了将来的知识,在您的data.table版本中,如果您要覆盖df,只需通过引用进行分配,即setDT(df)而不是df <- as.data.table(df)

此外,在:=对象中使用引用分配(data.table)时,df<-中不需要。

此外,您还可以使用data.table data.table函数对setorder进行排序(但不是必须,不是在这种特定情况下,也不是一般情况)。

最后,在将两个变量传递到by参数时,您应该使用list(type, date).(type, date)c("type", "date")"type,date"

因此,为了完整性,这是dplyr版本

library(dplyr)
df %>% 
  group_by(type, date) %>% 
  mutate(typeDateGroup = n())

答案 1 :(得分:4)

有两种选择:

## Using base R only:
df <- transform(df, typeDateGroup=ave(as.numeric(date), type, date, FUN=length))

## With data.table:
library(data.table)
dt <- data.table(df)
dt[, typeDateGroup:=.N, by=c("type","date")]