2

我有一个看起来像这样的数据框(从真实数据中截断):

   host month    score        se
1   V43     0 8.000000 0.4472136
2   V43     1 6.000000 0.0000000
3   V43     3 6.000000 0.0000000
4   V51     0 6.000000 0.0000000
5   V51     1 7.333333 0.4216370
6   V51     3 7.333333 0.2108185
7   V51     6 6.000000 0.0000000

我想从该主机每个月的分数中减去每个主机的第 0 个月分数。每个主机的第 0 个月分数需要单独应用,因此它看起来像这样:

   host month     score         se
1   V43     0  0.000000 0.4472136
2   V43     1 -2.000000 0.0000000
3   V43     3 -2.000000 0.0000000
4   V51     0  0.000000 0.0000000
5   V51     1  1.333333 0.4216370
6   V51     3  1.333333 0.2108185
7   V51     6  0.000000 0.0000000

换句话说,我希望每个月都显示与起点的差异,而不是绝对值。

找到月份 0 行很容易,但我不知道如何将每一行与正确的主机匹配并进行减法。有没有办法在不使用for循环的情况下做到这一点?

4

2 回答 2

1

使用,并首先plyr对数据框进行排序。hostmonth

ddply(df, .(host), transform, score=score-score[1])
于 2013-07-19T16:20:08.643 回答
0

这是一种方法。这有一个 for 循环,但它不会循环遍历数据框中的每一行,它只是循环遍历每个主机。

x <- data.frame(host = c(43, 43, 43, 51, 51, 51, 51), month = c(0,1,2,0,2,4,5), val = c(12, 19, 32, 3, 5, 7, 9))

y <- split(x, x$host)

output <- NULL

for (h in y) {
    start.i <- which(h$month ==0, arr.ind = TRUE)
    h$val <- h$val - h$val[start.i]

    output <- rbind(output, h)
}
于 2013-07-19T16:33:18.000 回答