在 R 中计算相对于基线的变化

use*_*944 1 r sas

我有一个 R 数据集,其中包含按时间的观察结果。对于每个主题,我最多有 4 行,一个 ID 变量、一个时间变量和一个名为 X 的变量,该变量是数字变量(但也可以是分类变量)。我希望按 ID 计算每行相对于基线的变化。到目前为止,我都是在 SAS 中完成此操作,这是我的 SAS 代码:

data want;
retain baseline;
set have;
if (first.ID) then baseline = .;
if (first.ID) then baseline = X;
else baseline = baseline;
by ID;
Change = X-baseline;
run;
Run Code Online (Sandbox Code Playgroud)

我的问题是:如何在 R 中执行此操作?先感谢您。

数据集示例(在SAS中,我不知道如何在R中做到这一点)。

data have;
input ID, Time, X;
datalines;
1 1 5
1 2 6
1 3 8
1 4 9
2 1 2
2 2 2
2 3 7
2 4 0
3 1 1
3 2 4
3 3 5
;
run;
Run Code Online (Sandbox Code Playgroud)

Jan*_*aan 5

生成一些示例数据:

dta <- data.frame(id = rep(1:3, each=4), time = rep(1:4, 3), x = rnorm(12))

# > dta
# id time            x
# 1   1    1 -0.232313499
# 2   1    2  1.116983376
# 3   1    3 -0.682125947
# 4   1    4 -0.398029820
# 5   2    1  0.440525082
# 6   2    2  0.952058966
# 7   2    3  0.690180586
# 8   2    4 -0.995872696
# 9   3    1  0.009735667
# 10  3    2  0.556254340
# 11  3    3 -0.064571775
# 12  3    4 -1.003582676
Run Code Online (Sandbox Code Playgroud)

dplyr我为此使用该包。默认情况下不安装此软件包,因此,如果尚未安装,则必须先安装它。

步骤是:按 id 对数据进行分组(每组执行以下操作),对数据进行排序以确保按时间排序(第一条记录是基线),然后计算一个新列,该列是 x 之间的差和 x 的第一个值。结果存储在新的 data.frame 中,但当然也可以分配回dta

library(dplyr)

dta_new <- dta %>% group_by(id) %>% arrange(id, time) %>% 
  mutate(change = x - first(x))


# > dta_new
# Source: local data frame [12 x 4]
# Groups: id [3]
# 
# id  time            x      change
# <int> <int>        <dbl>       <dbl>
# 1      1     1 -0.232313499  0.00000000
# 2      1     2  1.116983376  1.34929688
# 3      1     3 -0.682125947 -0.44981245
# 4      1     4 -0.398029820 -0.16571632
# 5      2     1  0.440525082  0.00000000
# 6      2     2  0.952058966  0.51153388
# 7      2     3  0.690180586  0.24965550
# 8      2     4 -0.995872696 -1.43639778
# 9      3     1  0.009735667  0.00000000
# 10     3     2  0.556254340  0.54651867
# 11     3     3 -0.064571775 -0.07430744
# 12     3     4 -1.003582676 -1.01331834
Run Code Online (Sandbox Code Playgroud)