使用此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?
你可以有点喜欢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)