繁体   English   中英

dplyr:行之间的差异

[英]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

任何建议如何使用dplyrR执行此dplyr

您可以在其中找到一些funs . 表示您正在操作的向量。

mutate_atvars(-SiteID)将在除SiteID之外的每个变量上调用您传递的任何函数(因此, -就像子设置一样)。 要建立通过它的功能,你可以在管前写你自己的,但*_at (和*_if*_all )功能,可以采取funs的辅助功能,可以很容易地动态创建功能。 如果您像在列表项(例如list(a = 1) )这样funs命名函数,它将使用该名称作为后缀来为每个变量创建一个新版本。 该函数可以是任何东西,只要它返回适当长度的向量即可,并且可以使用构造. ,它在funs表示要对其进行操作的向量-这里是整个变量,但如果分组,则是该组的向量。 因此,我们可以用c分段创建向量,其中

  • 前两个术语保持不变.[1:2]
  • 第三个减去前两个..3的总和.[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM