dplyr:行之间的差异

shi*_*iny 1 row r dplyr

使用此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)
Run Code Online (Sandbox Code Playgroud)

我想创建两个新列(measured_diff和modelled_diff).在这两个新列中,site1和site2的值将与测量和建模的值相同.但是,对于其他站点,其值将类似于以下

site3的measured_diff = site3的测量 - 总和(测量site1和site2)

site4的measured_diff = site4的测量值 - 测量site3

site5的measured_diff = site5的测量值 - site4的测量值

site6的measured_diff = site6的测量值 - site5的测量值

site7的measured_diff = site7的测量值 - 为site6测量

同样的 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
Run Code Online (Sandbox Code Playgroud)

有什么建议如何R使用dplyr

ali*_*ire 7

你可以有点喜欢funs,其中.代表你正在操作的矢量.

使用mutate_atwith vars(-SiteID)会调用你在每个变量上传递的任何函数SiteID(因此-,就像子集一样).要创建传递它的函数,您可以在管道之前编写自己的函数,但是*_at(*_if*_all)函数可以使用funs辅助函数,这使得动态创建函数变得容易.如果您在funs列表项(例如list(a = 1))中命名您的函数,它将使用名称作为后缀创建每个变量的新版本.该函数可以是任何东西,只要它返回一个适当长度的向量,并且可以用它构造.,其内部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
Run Code Online (Sandbox Code Playgroud)