R 使用条件从一行中减去另一行

R 使用条件从一行中减去另一行,r,row,subtraction,R,Row,Subtraction,我有一张这样的桌子: treatment individual phase dist_mean track 1 control 1 pre 13.33 569.99 2 control 1 post 10.95 624.65 3 control 2 pre 9.93 363.35 4 control 2 post 10.11 339.88 5 contr

我有一张这样的桌子:

  treatment individual phase dist_mean  track
1   control          1   pre     13.33 569.99
2   control          1  post     10.95 624.65
3   control          2   pre      9.93 363.35
4   control          2  post     10.11 339.88
5   control          3   pre     12.00 676.42
6   control          3  post     12.80 939.15

原则上,两行始终成对。我需要从样本的前阶段减去后阶段的
dist_mean
。简单的方法是从1中减去第2行,依此类推。但考虑到这一顺序在任何时候都可能受到干扰,整个计算都会出错。这就是为什么我希望在两个阶段的治疗和个体匹配的条件下进行计算信息:治疗改变。它并不总是
控制
使用
聚合

aggregate(dist_mean ~ treatment + individual, df1, function(x) diff(rev(x)))
#  treatment individual dist_mean
#1   control          1      2.38
#2   control          2     -0.18
#3   control          3     -0.80
数据

df1 <- read.table(text = "
  treatment individual phase dist_mean  track
1   control          1   pre     13.33 569.99
2   control          1  post     10.95 624.65
3   control          2   pre      9.93 363.35
4   control          2  post     10.11 339.88
5   control          3   pre     12.00 676.42
6   control          3  post     12.80 939.15
", header = TRUE)
df1
df%
枢轴宽度(c(治疗,个体),名称=相位,值=距离=平均值)%>%
变异(d=后-前)
#>#tibble:3 x 5
#>治疗前和治疗后d
#>                 
#>1控制1 13.3 11.0-2.38
#>2控制2 9.93 10.1 0.180
#>3控制3 12 12.8 0.8
由(v1.0.0)于2021-03-09创建

数据表

df 1:控制1 10.95 13.33-2.38
#>2:控制2 10.11 9.93 0.18
#>3:控制3 12.80 12.00 0.80
由(v1.0.0)

使用data.table于2021-03-09创建,重新整形,然后获得后/前列中的差异:

library(data.table)

setDT(df1)

dcast(df1, treatment + individual ~ phase, value.var = c("dist_mean", "track")
      )[, .(treatment, individual,
            diff_dist_mean = dist_mean_post - dist_mean_pre,
            diff_track = track_post - track_pre)]
#    treatment individual diff_dist_mean diff_track
# 1:   control          1          -2.38      54.66
# 2:   control          2           0.18     -23.47
# 3:   control          3           0.80     262.73

A
数据表
选项

setDT(df)[
  order(treatment, individual, phase)
][
  ,
  setNames(lapply(.SD, diff), paste0("diff_", names(.SD))),
  by = .(treatment, individual),
  .SDcols = c("dist_mean", "track")
]
给予


使用
重塑

transform(
  reshape(
    df,
    direction = "wide",
    idvar = c("treatment", "individual"),
    timevar = "phase"
  ),
  diff_dist_mean = dist_mean.pre - dist_mean.post,
  diff_track = track.pre - track.post
)
给予

transform(
  reshape(
    df,
    direction = "wide",
    idvar = c("treatment", "individual"),
    timevar = "phase"
  ),
  diff_dist_mean = dist_mean.pre - dist_mean.post,
  diff_track = track.pre - track.post
)
  treatment individual dist_mean.pre track.pre dist_mean.post track.post
1   control          1         13.33    569.99          10.95     624.65
3   control          2          9.93    363.35          10.11     339.88
5   control          3         12.00    676.42          12.80     939.15
  diff_dist_mean diff_track
1           2.38     -54.66
3          -0.18      23.47
5          -0.80    -262.73