我在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;
答案 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