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]
感谢您关注此事并主宰您的技能。
答案 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")]