df R中每x行的总和,仅在第x行输出。 [R

时间:2017-06-29 13:51:46

标签: r dplyr

我有一个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,它会重复。

3 个答案:

答案 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