R新列总结了列组的数量

ben*_*ays 1 r dataframe dplyr data.table

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
Run Code Online (Sandbox Code Playgroud)

设置以下唯一名为'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
Run Code Online (Sandbox Code Playgroud)

我正在寻求有关基础R,data.table或甚至dplyr爱好者如何创建新列的帮助,该列列出了为给定'日期'记录'类型'的次数.

  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
Run Code Online (Sandbox Code Playgroud)

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

不要跑这个,这是我的尝试,它失败了......

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

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

Dav*_*urg 5

对于未来的知识,在您的data.table版本中,如果您想要覆盖df只是通过引用进行分配,即setDT(df)代替df <- as.data.table(df).

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

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

最后,经过两个变量进入时by的说法,你应该使用list(type, date).(type, date)c("type", "date")"type,date"

所以为了完整性,这是dplyr版本

library(dplyr)
df %>% 
  group_by(type, date) %>% 
  mutate(typeDateGroup = n())
Run Code Online (Sandbox Code Playgroud)