首页 > 解决方案 > 如何将前导行中的每一行减去R中的每五行?

问题描述

我有一个更大的数据框,其中包含多列和数千行。我想通过从数据帧的每五行的前导行中减去前一行的值来替换每个前导行的值。例如,第一个值应该保留它的值,第二行应该是:second row - first row。同样,第六行应保留其值,但是,第七行将是seventh row - sixth row. 这是一个示例数据框

DF = data.frame(A= c(1:11), B = c(11:21))

输出应如下所示

> Output
    A  B
1   1 11
2   1  1
3   1  1
4   1  1
5   1  1
6   6 16
7   1  1
8   1  1
9   1  1
10  1  1
11 11 21

标签: rdataframeaggregatesubtractiontapply

解决方案


一种选择是创建一个分组变量,然后进行转换,diff 其中选择的列的相邻元素之间的差异mutate_all(如果只需要列的一个子集,请使用mutate_ifmutate_at

library(dplyr) #v_0.8.3
DF %>% 
   group_by(grp = as.integer(gl(n(), 5, n()))) %>% 
   mutate_all(~c(first(.), diff(.))) %>%
   ungroup %>%
   select(-grp)
# A tibble: 11 x 2
#       A     B
#   <int> <int>
# 1     1    11
# 2     1     1
# 3     1     1
# 4     1     1
# 5     1     1
# 6     6    16
# 7     1     1
# 8     1     1
# 9     1     1
#10     1     1
#11    11    21

当我们使用mutate_allafter时,上面也给出了一个警告group_by(以前它曾经工作过 - 在新版本中,正确的语法是使用mutate_at

DF %>% 
   group_by(grp = as.integer(gl(n(), 5, n()))) %>% 
   mutate_at(vars(-group_cols()), ~c(first(.), diff(.))) %>%
   ungroup %>%
   select(-grp)

推荐阅读