r - 使用长格式的数据计算基线的变化

标签 r

这是我的数据的一个可重现的小示例:

> mydata <- structure(list(subject = c(1, 1, 1, 2, 2, 2), time = c(0, 1, 2, 0, 1, 2), measure = c(10, 12, 8, 7, 0, 0)), .Names = c("subject", "time", "measure"), row.names = c(NA, -6L), class = "data.frame")

> mydata

subject  time  measure
1          0      10
1          1      12
1          2       8
2          0       7
2          1       0
2          2       0

我想生成一个新变量,即“相对于基线的变化”。也就是说,我想
subject  time  measure  change
1          0      10      0
1          1      12      2
1          2       8     -2
2          0       7      0
2          1       0     -7
2          2       0     -7

除了以编程方式遍历所有记录或首先重整形为宽格式之外,是否有一种简单的方法可以做到这一点?

最佳答案

关于什么:

mydata$change <- do.call("c", with(mydata, lapply(split(measure, subject), function(x) x - x[1])))

或者,您也可以使用ave函数:
with(mydata, ave(measure, subject, FUN=function(x) x - x[1]))
# [1]  0  2 -2  0 -7 -7

要么
within(mydata, change <- ave(measure, subject, FUN=function(x) x - x[1]))
#   subject time measure change
# 1       1    0      10      0
# 2       1    1      12      2
# 3       1    2       8     -2
# 4       2    0       7      0
# 5       2    1       0     -7
# 6       2    2       0     -7

关于r - 使用长格式的数据计算基线的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14788187/

相关文章:

R - 多元 GARCH 建模(rugarch 和 ccgarch)

r - 每列循环

R 函数生成不正确的结果

r - R中的并行while循环

r - 向量化 R 代码以从每行中随机选择 2 列

r - 如何将具有不同列名的数据框从宽转换为长,具有不同的列名

r - rbind 可以在 R 中并行化吗?

r - 根据另一列中的行子集从多列中获取最大值

r - 如何删除一行,字符串以空格开头?

r - 有人能告诉我为什么 R 没有将整个 data.frame 用于这个 chisq.test 吗?