Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何将前导行中的每一行减去R中的每五行?_R_Dataframe_Aggregate_Subtraction_Tapply - Fatal编程技术网

如何将前导行中的每一行减去R中的每五行?

如何将前导行中的每一行减去R中的每五行?,r,dataframe,aggregate,subtraction,tapply,R,Dataframe,Aggregate,Subtraction,Tapply,我有一个更大的数据框,它有多列和数千行。我想通过从数据帧的每五行的前导行中减去前一行的值来替换每个前导行的值。例如,第一个值应保留其值,第二行应为:second row-first 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

我有一个更大的数据框,它有多列和数千行。我想通过从数据帧的每五行的前导行中减去前一行的值来替换每个前导行的值。例如,第一个值应保留其值,第二行应为:
second row-first 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

一个选项是创建一个分组变量,然后使用
diff
进行转换,该转换会对
mutate\u all
中所选列的相邻元素进行差异(如果只需要列的子集,则使用
mutate\u if
mutate\u at

另一个选项是创建另一个带有移位行的data.frame并直接进行减法

ind = ave(1:nrow(DF), ceiling(1:nrow(DF)/5), FUN = function(x) c(x[1], x[-length(x)]))
DF2 = DF[ind,] * replace(rep(1, nrow(DF)), diff(ind) == 0, 0)
DF - DF2

您可以使用
%/%
行号减去1乘以5来获得组,然后使用
diff
来获得与每个组的
x
的前一个
x
(如果没有前一个
x
)的差异

library(data.table)
setDT(DF)

DF[, lapply(.SD, function(x) diff(c(0, x)))
   , (1:nrow(DF) - 1) %/% 5][, -1]

#      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
或者,正如@akrun所提到的,您可以通过替换

lapply(.SD, function(x) diff(c(0, x)))

另一个不那么严重的选择:

x <- DF[, !(.I - 1) %% 5]
DF*(1 + x) - DF[DF[, .I - !x]]

#      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

x在执行代码``mutate\u all()`时获取此错误消息时忽略了以下分组变量:Column
grp
使用
mutate\u at(df,vars(-group\u cols()),myoperation)
使消息静音。select(,-grp)中出错:未使用的参数(-grp)`@Hydrologist是否与您显示的数据相同,因为我无法使用
dplyr_0.8.3
复制它。我有不同的数据,但在我的一端尝试了相同的数据。相同error@Hydrologist所以,你显示的数据没有出现错误,对吗?您能否检查新数据的
str
,并与显示的数据进行比较。我有一种感觉,有一些群体属性导致了它。您是否可以
取消分组
,然后再次执行
分组
。我正在为您提供的答案添加一个屏幕截图,因为我不知道是否可以将其包含在我的评论中。最好检查
dplyr
version
packageVersion('dplyr')
my installed
dplyr
version是
'0.8.0.1'
您能否更新您的版本,因为它可能会影响安装的软件包,它现在是“0.8.3”版本并得到了结果。但是,我也收到了这样的警告:
mutate_all()
忽略了以下分组变量:Column
grp
使用
mutate_at(df,vars(-group_cols()),myoperation)
来关闭消息。感谢@akrun和其他人提供了非常有用的建议。
library(data.table)
setDT(DF)

DF[, lapply(.SD, function(x) diff(c(0, x)))
   , (1:nrow(DF) - 1) %/% 5][, -1]

#      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
lapply(.SD, function(x) diff(c(0, x)))
.SD - shift(.SD, fill = 0)
x <- DF[, !(.I - 1) %% 5]
DF*(1 + x) - DF[DF[, .I - !x]]

#      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