![](/img/trans.png)
[英]How to use dplyr to calculate difference between a set of rows and a target row?
[英]dplyr: difference between rows
使用此data.frame
数据
df <- read.table(text = c("
SiteID measured modelled
site1 50 47
site2 28 30
site3 158 162
site4 247 243
site5 456 463
site6 573 564
site7 634 640"), ,header =T)
我想创建两个新列(measured_diff和modelled_diff)。 在这两个新列中,site1和site2的值将与测量和建模的值相同。 但是,对于其他网站,其价值将与以下相似
site3的measured_diff =站点3的测量值-总和(站点1和site2的测量值)
站点4的实测_差异=站点4的实测-站点3的实测
网站5的实测_差异=网站5的实测-网站4的实测
网站6的实测_差异=网站6的实测-网站5的实测
站点7的实测_差异=站点7的实测-站点6的实测
与modelled_diff
相同
最后结果
应该如下
# SiteID measured modelled diff_measured diff_modelled
#1 site1 50 47 50 47
#2 site2 28 30 28 30
#3 site3 158 162 80 85
#4 site4 247 243 89 81
#5 site5 456 463 209 220
#6 site6 573 564 117 101
#7 site7 634 640 61 76
任何建议如何使用dplyr
在R
执行此dplyr
?
您可以在其中找到一些funs
.
表示您正在操作的向量。
将mutate_at
与vars(-SiteID)
将在除SiteID
之外的每个变量上调用您传递的任何函数(因此, -
就像子设置一样)。 要建立通过它的功能,你可以在管前写你自己的,但*_at
(和*_if
和*_all
)功能,可以采取funs
的辅助功能,可以很容易地动态创建功能。 如果您像在列表项(例如list(a = 1)
)这样funs
命名函数,它将使用该名称作为后缀来为每个变量创建一个新版本。 该函数可以是任何东西,只要它返回适当长度的向量即可,并且可以使用构造.
,它在funs
表示要对其进行操作的向量-这里是整个变量,但如果分组,则是该组的向量。 因此,我们可以用c
分段创建向量,其中
.[1:2]
, .[3] - sum(.[1:2])
和 base::diff
,它返回的向量比传递的向量短一个。 全部一起:
df %>% mutate_at(vars(-SiteID),
funs(diff = c(.[1:2], .[3] - sum(.[1:2]), diff(.[-1:-2]))))
## SiteID measured modelled measured_diff modelled_diff
## 1 site1 50 47 50 47
## 2 site2 28 30 28 30
## 3 site3 158 162 80 85
## 4 site4 247 243 89 81
## 5 site5 456 463 209 220
## 6 site6 573 564 117 101
## 7 site7 634 640 61 76
这是使用data.table
的选项
library(data.table)
setDT(df)[ , paste0("diff_", names(df)[-1]) := lapply(.SD, function(x)
c(x[1:2], x[3]- sum(x[1:2]), na.omit(shift(x, type="lead")-
x)[-(1:2)])) , .SDcols = -1]
df
# SiteID measured modelled diff_measured diff_modelled
#1: site1 50 47 50 47
#2: site2 28 30 28 30
#3: site3 158 162 80 85
#4: site4 247 243 89 81
#5: site5 456 463 209 220
#6: site6 573 564 117 101
#7: site7 634 640 61 76
或与diff
setDT(df)[, aste0("diff_", names(df)[-1]) :=
lapply(.SD, function(x) c(x[1:2], x[3]- sum(x[1:2]), tail(diff(x),-2))), .SDcols = -1]
或使用base R
df[paste0("diff_", names(df)[-1])] <- lapply(df[-1], function(x)
c(x[(1:2)], x[3]- sum(x[1:2]), tail(diff(x), -2)))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.