我有一个 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)
生成一些示例数据:
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)
| 归档时间: |
|
| 查看次数: |
1961 次 |
| 最近记录: |