从R中的基线计算变化

时间:2016-10-08 09:13:57

标签: r sas

我在R中有一个数据集,其中包含按时间观察的数据。对于每个主题,我有最多4行,ID变量以及Time变量和一个名为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;

我的问题是:我如何在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;

1 个答案:

答案 0 :(得分:3)

生成一些示例数据:

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

我使用包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