R新列汇总列组的计数

R new column summarizing count of groups of columns

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 列出数量的新列 为给定的 'date'.

记录了 'type' 的次数
  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]

感谢您查看此内容并用您的技能控制。

几个选项:

## 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")]

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

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

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

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

为了完整起见,这里是 dplyr 版本

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