我有Date(B列)和Total(A列)变量 - 如何在R中创建一个新的变量,它总结了前七天的Totals总值?
在Excel中,我有以下公式:
=SUMIFS($A:$A,$B:$B, ">="&$B20-7,$B:$B,"<"&$B20)
而我只是不知道如何将其转换为在R.建议?
答案 0 :(得分:2)
这也会做得很好,先进,但很短 - 基本上是单行。
import socket
import sys
# Create a TCP/IP socket
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_address = ('192.168.1.108', 8080)
server_socket.bind(server_address)
server_socket.listen(1)
while True:
# Find connections
connection, client_address = server_socket.accept()
try:
data = connection.recv(1024)
print data
except:
connection.close()
更改变量名称以匹配提出的问题。
它还可以按任意顺序处理数据,每天处理多个条目。
编辑添加评论并使其适合窗口。
答案 1 :(得分:1)
如果每天总计一次,此功能可能会有所帮助:
rollSums <- function(totals, roll) {
res <- c()
for(i in 1:(length(totals)-roll)) {
res <- c(res, sum(totals[0:(roll-1)+i]))
}
res
}
df1
Total Date
1 3 2015-01-01
2 8 2015-01-01
3 4 2015-01-02
4 7 2015-01-03
5 6 2015-01-04
6 1 2015-01-04
7 10 2015-01-05
8 9 2015-01-06
9 2 2015-01-07
10 5 2015-01-08
rollSums(df1$Total, 3)
[1] 15 19 17 14 17 20 21
rollSums(df1$Total, 4)
[1] 22 25 18 24 26 22
这将需要两个参数,即带有总数的向量以及每个总和中你想要的天数。
dput(df1)
structure(list(Total = c(3L, 8L, 4L, 7L, 6L, 1L, 10L, 9L, 2L,
5L), Date = structure(c(16436, 16436, 16437, 16438, 16439, 16439,
16440, 16441, 16442, 16443), class = "Date")), .Names = c("Total",
"Date"), row.names = c(NA, -10L), class = "data.frame")
如果您在同一天遇到多个值的情况,这是一个解决方案。令人惊讶的是,@ MikeWise有一个可以完成所有这一切的单线程。见其他答案。
grouped.roll <- function(DF, Values, Group, roll) {
totals <- eval(substitute(with(DF, tapply(Values, Group, sum))))
newsums <- rollSums(totals, roll)
data.frame(Group=names(totals), Sums=c(rep(NA, roll), newsums))
}
它使用我之前使用的rollSums
。它将吐出NA,直到所需的日期分组开始。这可能是唯一优于其他答案的优势。但他们很容易编辑,我敢肯定。只是提供更多选择供参考。
grouped.roll(df1, Total, Date, 3)
Group Sums
1 2015-01-01 NA
2 2015-01-02 NA
3 2015-01-03 NA
4 2015-01-04 22
5 2015-01-05 18
6 2015-01-06 24
7 2015-01-07 26
8 2015-01-08 21