我有一个df:
df <- data.frame(x = c(1,2,3,4,5,6,7,8,9,10,11,12,13),
y = c(0,0,2,0,1,0,0,0,0,3,0,4,0))
我正在寻找精确时刻每4行的总和(在第4时刻之后)这应该是输出:
x y z
1 0 0
2 0 0
3 2 0
4 0 2
5 1 0
6 0 0
7 0 0
8 0 1
9 0 0
10 3 0
11 0 0
12 4 7
13 0 0
使用dplyr,我能够使用以下结果创建以下代码。
a <- df %>%
dplyr::mutate(b = gl(ceiling(nrow(x)/4), 4, nrow(x))) %>%
dplyr::group_by(b) %>%
dplyr::mutate(sum = sum(amount))
x y z
1 0 2
2 0 2
3 2 2
4 0 2
5 1 1
6 0 1
7 0 1
8 0 1
9 0 7
10 3 7
11 0 7
12 4 7
13 0 0
但我无法删除数字并将其替换为0除了第4行,但问题是如果我有一段时间0,它会重复。
答案 0 :(得分:6)
这可以通过.DirectoryName
包中的rollapply
轻松实现,即
zoo
答案 1 :(得分:5)
按&#39; b&#39;分组后使用x = j
创建,我们创建了&#39; z&#39;通过获取&{39; y&#39;的gl
列并乘以逻辑向量(sum
),以便除最后一行外,所有其他元素都变为0
row_number()==n()
如果我们需要一个外部包,可以使用高效的library(dplyr)
df %>%
group_by(b = gl(ceiling(n()/4), 4, n())) %>%
mutate(z = sum(y) * (row_number()== n())) %>%
ungroup() %>%
select(-b)
# A tibble: 13 x 3
# x y z
# <dbl> <dbl> <dbl>
# 1 1 0 0
# 2 2 0 0
# 3 3 2 0
# 4 4 0 2
# 5 5 1 0
# 6 6 0 0
# 7 7 0 0
# 8 8 0 1
# 9 9 0 0
#10 10 3 0
#11 11 0 0
#12 12 4 7
#13 13 0 0
,也可以轻松实现输出
RcppRoll
答案 2 :(得分:2)
在基地R
df$z = 0
replace(df$z,
seq_along(df$z)%%4 == 0,
sapply(split(df$y, floor(seq_along(df$y)/4.01)), sum))
# [1] 0 0 0 2 0 0 0 1 0 0 0 7 0
#Warning message:
#In replace(df$z, seq_along(df$z)%%4 == 0, sapply(split(df$y, #floor(seq_along(df$y)/4.01)), :
# number of items to replace is not a multiple of replacement length