Cat*_*ack 10 r data.table
我有一个data.table,在30年的时间里每天有一行,有许多不同的变量列.使用data.table的原因是我正在使用的.csv文件很大(大约120万行),因为有一些名为"key"的列所描述的许多组的数据有30年的价值.
示例数据集如下所示:
Key Date Runoff
A 1980-01-01 2
A 1980-01-02 1
A 1981-01-01 0.1
A 1981-01-02 3
A 1982-01-01 2
A 1982-01-02 5
B 1980-01-01 1.5
B 1980-01-02 0.5
B 1981-01-01 0.3
B 1981-01-02 2
B 1982-01-01 1.5
B 1982-01-02 4
Run Code Online (Sandbox Code Playgroud)
以上是两个"关键点"的样本,1月份的一些数据显示了我的意思.实际数据集有每个"密钥"数百个"密钥"和30年的数据.
我想要做的是产生一个输出,其中每个键的每个月的总平均值如下所示:
Key January February March.... etc
A 4.36 ... ...
B 3.26 ... ...
Run Code Online (Sandbox Code Playgroud)
即Key A =(2 + 1)+(0.1 + 3)+(2 + 5)/ 3的1月份总平均值
当我在一个三十年的数据集(即只有一个键)上完成此分析时,我已成功使用以下代码来实现此目的:
runoff_tot_average <- rowsum(DF$Runoff, format(DF$Date, '%m')) / 30
Run Code Online (Sandbox Code Playgroud)
DF是一个30年数据集的数据框.
那么我可以请求如何修改上面的代码以使用包含许多"键"的更大数据集或提供全新的解决方案!
编辑
以下代码生成以上数据示例:
Key <- c("A", "A", "A", "A", "A", "A", "B", "B", "B", "B", "B", "B")
Date <- as.Date(c("1980-01-01", "1980-01-02", "1981-01-01", "1981-01-02", "1982-01-01", "1982-01-02", "1980-01-01", "1980-01-02", "1981-01-01", "1981-01-02", "1982-01-01", "1982-01-02"))
Runoff <- c(2, 1, 0.1, 3, 2, 5, 1.5, 0.5, 0.3, 2, 1.5, 4)
DT <- data.table(Key, Date, Runoff)
Run Code Online (Sandbox Code Playgroud)
Dav*_*urg 12
他们只能通过两个步骤来考虑这样做.可能不是最好的方式,但是这里
DT[, c("YM", "Month") := list(substr(Date, 1, 7), substr(Date, 6, 7))]
DT[, Runoff2 := sum(Runoff), by = c("Key", "YM")]
DT[, mean(Runoff2), by = c("Key", "Month")]
## Key Month V1
## 1: A 01 4.366667
## 2: B 01 3.266667
Run Code Online (Sandbox Code Playgroud)
只是为了表明另一种(非常相似)的方式:
DT[, c("year", "month") := list(year(Date), month(Date))]
DT[, Runoff2 := sum(Runoff), by=list(Key, year, month)]
DT[, mean(Runoff2), by=list(Key, month)]
Run Code Online (Sandbox Code Playgroud)
请注意,您不具备创建新列,by支持表现为好.也就是说,您可以直接使用它们by如下:
DT[, Runoff2 := sum(Runoff), by=list(Key, year = year(Date), month = month(Date))]
Run Code Online (Sandbox Code Playgroud)
但是由于你需要聚合不止一次,所以将它们作为附加列存储会更好(速度),正如@David在此处所示.
如果您不是在寻找复杂的功能而只是想要均值,那么以下内容就足够了:
DT[, sum(Runoff) / length(unique(year(Date))), list(Key, month(Date))]
# Key month V1
#1: A 1 4.366667
#2: B 1 3.266667
Run Code Online (Sandbox Code Playgroud)