如何将前导行中的每一行减去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()`时获取此错误消息时忽略了以下分组变量:Columngrp
使用mutate\u at(df,vars(-group\u cols()),myoperation)
使消息静音。select(,-grp)中出错:未使用的参数(-grp)`@Hydrologist是否与您显示的数据相同,因为我无法使用dplyr_0.8.3
复制它。我有不同的数据,但在我的一端尝试了相同的数据。相同error@Hydrologist所以,你显示的数据没有出现错误,对吗?您能否检查新数据的str
,并与显示的数据进行比较。我有一种感觉,有一些群体属性导致了它。您是否可以取消分组
,然后再次执行分组
。我正在为您提供的答案添加一个屏幕截图,因为我不知道是否可以将其包含在我的评论中。最好检查dplyr
versionpackageVersion('dplyr')
my installeddplyr
version是'0.8.0.1'
您能否更新您的版本,因为它可能会影响安装的软件包,它现在是“0.8.3”版本并得到了结果。但是,我也收到了这样的警告:mutate_all()
忽略了以下分组变量:Columngrp
使用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